返回

ImageView的缩放方式:ScaleType详解及其源码分析

Android

ImageView的ScaleType取值

ImageView的ScaleType属性共有12种取值,分别如下:

  • CENTER :图片居中显示,如果图片的宽高比与ImageView的宽高比不一致,则图片将被拉伸或压缩以填充整个ImageView。
  • CENTER_CROP :图片居中显示,图片将被裁剪以填充整个ImageView,保持图片的原始宽高比。
  • CENTER_INSIDE :图片居中显示,图片将被缩小或放大以适应ImageView,保持图片的原始宽高比,图片不会被裁剪。
  • FIT_CENTER :图片居中显示,图片将被缩放以填充整个ImageView,保持图片的原始宽高比,图片不会被裁剪。
  • FIT_END :图片右下角对齐显示,图片将被缩小或放大以适应ImageView,保持图片的原始宽高比,图片不会被裁剪。
  • FIT_START :图片左上角对齐显示,图片将被缩小或放大以适应ImageView,保持图片的原始宽高比,图片不会被裁剪。
  • FIT_XY :图片将被缩放以填充整个ImageView,图片的宽高比将被忽略。
  • MATRIX :使用矩阵变换来显示图片,图片将按照矩阵的规定进行缩放、平移和旋转。
  • NONE :图片不进行任何缩放,按照原始大小显示。

ImageView的ScaleType源码分析

ImageView的ScaleType属性的取值对应着不同的缩放方式,这些缩放方式都是通过ScaleType类的不同方法来实现的。ScaleType类位于android.widget包中,它的源码如下:

public enum ScaleType {

    /**
     * Scale the image using {@link Matrix#SCALE_MATRIX} matrix.
     */
    MATRIX(0),

    /**
     * Scale the image using {@link Matrix#FIT_XY} matrix.
     */
    FIT_XY(1),

    /**
     * Scale the image using {@link Matrix#FIT_START} matrix.
     */
    FIT_START(2),

    /**
     * Scale the image using {@link Matrix#FIT_CENTER} matrix.
     */
    FIT_CENTER(3),

    /**
     * Scale the image using {@link Matrix#FIT_END} matrix.
     */
    FIT_END(4),

    /**
     * Center the image in the view, but perform no scaling.
     */
    CENTER(5),

    /**
     * Center the image in the view, but perform no scaling.
     */
    CENTER_CROP(6),

    /**
     * Center the image in the view, but perform no scaling.
     */
    CENTER_INSIDE(7);

    ScaleType(int ni) {
        nativeInt = ni;
    }

    final int nativeInt;

    static ScaleType fromInt(int ni) {
        for (ScaleType st : ScaleType.values()) {
            if (st.nativeInt == ni) {
                return st;
            }
        }
        return null;
    }
}

从源码中可以看出,ScaleType类的每个取值对应着一种缩放方式,这些缩放方式都是通过矩阵变换来实现的。矩阵变换是一种通过矩阵来对图像进行缩放、平移和旋转的变换,矩阵变换的具体实现细节可以参考Android官方文档。

ImageView的ScaleType使用示例

在实际开发中,我们可以通过设置ImageView的ScaleType属性来控制图片的缩放方式。例如,以下代码将设置ImageView的缩放方式为CENTER_CROP:

<ImageView
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:scaleType="centerCrop"
    android:src="@drawable/image" />

这段代码将使ImageView中的图片居中显示,并裁剪图片以填充整个ImageView,保持图片的原始宽高比。

结语

ImageView的ScaleType属性可以控制图片在ImageView中的缩放方式,共有12种取值,分别对应着不同的缩放方式。通过设置ImageView的ScaleType属性,我们可以控制图片的缩放方式,以达到最佳的显示效果。