it编程 > App开发 > Android

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

23人参与 2025-04-27 Android

什么是 imageview.scaletype?

imageview.scaletype 是一个枚举类,它定义了不同的缩放方式,用于控制图片如何在 imageview 中展示。

public enum scaletype {
      matrix      (0),
      fit_xy      (1),
      fit_start   (2),
      fit_center  (3),
      fit_end     (4),
      center      (5),
      center_crop (6),
      center_inside (7);

      scaletype(int ni) {
         nativeint = ni;
      }
      final int nativeint;
}

先看下源图:

图片1尺寸是1200x857,且宽 > 高;图片2尺寸967x1301,且宽<高;图片3尺寸60x60,且宽=高。 xml代码如下:

<linearlayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerinparent="true"
    android:orientation="horizontal"
    android:gravity="center">

    <imageview
        android:id="@+id/iv_1"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:background="@color/gray_normal"
        android:src="@drawable/icon_cat_w" />

    <imageview
        android:id="@+id/iv_2"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:background="@color/gray_normal"
        android:layout_marginstart="10dp"
        android:src="@drawable/icon_cat_h" />

    <imageview
        android:id="@+id/iv_3"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_marginstart="10dp"
        android:background="@color/gray_normal"
        android:src="@drawable/chat_ask_message_error" />
</linearlayout>

我的测试机上density = 3,而imageview控件的目标宽高都是120dp,即宽高都是360x360。

fit_xy

图片完全填充 imageview,不保持原始宽高比,可能会导致图片拉伸或压缩变形。本质上使用 matrix.scaletofit.fill 来实现,上面代码中加上android:scaletype="fitxy",效果如下:

fit_start

等比缩放图片,使其宽高都不超过 imageview 的尺寸,然后左上角对齐。上面代码中加上android:scaletype="fitstart",效果如下:

fit_center

等比缩放图片,使其宽高都不超过 imageview 的尺寸,然后居中显示。上面代码中加上android:scaletype="fitcenter",效果如下:

fit_end

等比缩放图片,使其宽高都不超过 imageview 的尺寸,然后对齐到底部或右侧。上面代码中加上android:scaletype="fitend",效果如下:

center

不缩放图片,直接居中显示,如果图片大于 imageview,超出的部分不会显示。上面代码中加上android:scaletype="center",效果如下:

center_crop

等比放大图片,确保 imageview 填满,超出的部分裁剪掉,居中对齐,适用于头像、封面图等,填满 imageview 且保持图片比例。上面代码中加上android:scaletype="centercrop",效果如下:

center_inside

等比缩小图片,确保整个图片显示在 imageview 里。如果图片小于 imageview,不会放大。上面代码中加上android:scaletype="fitstart",效果如下:

matrix

完全由开发者控制,允许精确地设置图片的缩放、旋转、平移等变换。scaletype.matrix不会自动进行缩放或平移,开发者需要通过 matrix 来手动调整。默认上面代码中加上android:scaletype="matrix",效果如下:

特殊需求:从顶部裁剪图片

在某些情况下,你可能希望图片从顶部开始展示,裁剪掉底部溢出的部分。默认的 center_crop 会居中裁剪图片,但如果希望图片从顶部开始裁剪,可以使用 scaletype="matrix",然后通过 matrix 来控制,代码如下:

imageview.post {
    val drawable = imageview.drawable
    drawable?.let {
        val matrix = matrix()
        //计算缩放比例,确保宽度填充满 imageview
        val scale = imageview.width.tofloat() / it.intrinsicwidth
        matrix.setscale(scale, scale)
        //不平移,确保图片从顶部开始展示
        matrix.posttranslate(0f, 0f)
        //应用 matrix 到 imageview
        imageview.imagematrix = matrix
    }
}

执行效果:

可以看到结果中,图片1 因为宽>高,所以会直接从上往下排完;而图片2 宽<高,所以从上往下排列后,底部被裁剪了;图片3 宽等于高,所以还是可以完全展示。

结论

scaletype缩放方式是否填满imageview是否裁剪对齐方式
matrix自定义由 matrix 决定
fit_xy拉伸填充是(可能会变形)填充整个 imageview
fit_start等比缩放顶部/左侧对齐
fit_center等比缩放居中对齐
fit_end等比缩放底部/右侧对齐
center不缩放可能裁剪居中对齐
center_crop等比放大可能裁剪居中对齐
center_inside等比缩小居中对齐

选择合适的 scaletype,可以大大提高图片显示的效果和用户体验。理解并灵活应用这些选项,可以帮助我们更好地处理不同的图片展示需求。

以上就是android使用imageview.scaletype实现图片的缩放与裁剪功能的详细内容,更多关于android imageview.scaletype图片缩放与裁剪的资料请关注代码网其它相关文章!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

基于Android实现文件共享功能

04-27

Android使用okhttp通信的方法

04-26

基于Android实现写字板功能的代码详解

04-29

Android实现定时任务的几种方式汇总(附源码)

05-03

Android开发环境配置避坑指南

05-03

Android实现一键录屏功能(附源码)

05-04

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论