【Android】【bug】ImageView设置scaleType不生效的问题

问题

在设置ImageView的时候,添加了一张图片,图片是正方形的,但是图片要尽可能的占据控件,同时也要保证图片是不能变形的。

然后在图片里面使用了这个scaleType

java 复制代码
       <ImageView
                android:id="@+id/iv_luopan"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerHorizontal="true"
                android:background="@mipmap/ic_luopan"
                android:scaleType="centerInside" />

但是却是没有作用

问题解决

将这个 background 修改为 src 即

java 复制代码
   <ImageView
                android:id="@+id/iv_luopan"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerHorizontal="true"
                android:src="@mipmap/ic_luopan"
                android:scaleType="centerInside" />

ImageView的scaleType属性用于控制图像的缩放方式和显示效果。通过设置不同的scaleType,可以定义图像在ImageView中的显示方式,以适应不同的布局需求。以下是scaleType属性的几种常用值:

  1. CENTER
    描述: 将图像放置在ImageView的中心,不做任何缩放。
    效果: 如果图像比ImageView小,将保持原始大小并居中显示;如果图像大于ImageView,则部分图像会被裁剪。
  2. CENTER_CROP
    描述: 将图像缩放到足够大,以填充整个ImageView,然后从中心裁剪多余的部分。
    效果: 适合需要填充整个视图的场景,同时保持图像的纵横比。
  3. CENTER_INSIDE
    描述: 将图像缩放到适合ImageView,并保持其纵横比。
    效果: 图像会尽可能大,但不会超出ImageView的边界。如果图像比ImageView小,则会在ImageView中居中显示。
  4. FIT_CENTER
    描述: 将图像缩放到足够大以使其完全适合ImageView,同时保持其纵横比,并居中显示。
    效果: 适合希望图像完整显示的需求,但可能会留下空白区域。
  5. FIT_XY
    描述: 将图像缩放到完全填满ImageView,不保持图像的纵横比。
    效果: 图像可能会变形,因此通常不推荐在需要保持原始比例的情况下使用。
  6. FIT_START
    描述: 将图像缩放到适合ImageView,并保持其纵横比,同时将图像对齐到ImageView的顶部或左侧。
    效果: 图像将被居中到上方或左侧,底部或右侧可能有空白。
  7. FIT_END
    描述: 类似于FIT_START,但将图像对齐到底部或右侧。
    效果: 图像将被居中到下方或右侧,上方或左侧可能有空白。
  8. MATRIX
    描述: 使用自定义矩阵来绘制图像,可以进行复杂的变换。
    效果: 需要手动设置变换矩阵,适合高级用户进行自定义操作。
现在还有一个问题,

我要在图片中间显示一个数据,是要在图片中间显示,但是现在图片为了保持缩放比例,进行了限制,如果图片的布局父类是一个长度大于宽度的,或者宽度大于长度的布局,那怎么保证这个文字布局一定能显示在图片布局的中心位置呢?

解决方法

设置一个父类布局

java 复制代码
        <RelativeLayout
            android:id="@+id/rv_lay"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="@dimen/dp_6"
            android:padding="@dimen/dp_10">

            <ImageView
                android:id="@+id/iv_luopan"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_centerHorizontal="true"
                android:background="@mipmap/ic_luopan" />

            <TextView
                android:id="@+id/tv_luopan_jiaodu"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="--"
                android:textColor="@color/black"
                android:textSize="24sp"
                android:textStyle="bold" />
        </RelativeLayout>

不管外面的布局怎么变化,我就保证在这个 RelativeLayout 父类布局里面,图片占满布局,文字在父类布局的中心位置。

然后我们处理这个父类布局,让它的长和宽是相等的。

java 复制代码
       rv_lay.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // 移除监听器,避免重复调用
                rv_lay.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                // 获取实际宽高
                int width = rv_lay.getWidth();
                int height = rv_lay.getHeight();

                // 设置宽和高相等
                int size = Math.min(width, height);
                rv_lay.getLayoutParams().width = size;
                rv_lay.getLayoutParams().height = size;

                // 更新布局
                rv_lay.requestLayout();
            }
        });

这样就可以保证父类布局的长和宽是相等的了。

相关推荐
赏金术士17 分钟前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
TechMerger1 小时前
Android 17 重磅重构!服役 20 年的 MessageQueue 迎来无锁改造,卡顿大幅优化!
android·性能优化
yuhuofei20214 小时前
【Python入门】Python中字符串相关拓展
android·java·python
dalancon4 小时前
Android Input Spy Window
android
dalancon6 小时前
InputDispatcher派发事件,查找目标窗口
android
我命由我123456 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
天才少年曾牛7 小时前
Android14 新增系统服务后,应用调用出现 “hidden api” 警告的原因与解决方案
android·frameworks
赏金术士7 小时前
Jetpack Compose 底部导航实战教程(完整版)
android·kotlin·compose
随遇丿而安7 小时前
第5周:XML 资源、样式和主题,真正解决的是“页面以后还改不改得动”
android
zh_xuan8 小时前
Android 获取系统内存页大小:sysconf(_SC_PAGESIZE) 与 JNI 实现
android·jni·ndk·内存页大小