如何让ImageView的尺寸与图片的实际像素大小保持一致
问题原因
- 核心触发点为Android的资源密度适配自动缩放机制:
Android系统会根据图片存放的drawable目录对应的基准密度,结合运行设备的屏幕密度,自动对图片做缩放处理,保证图片在不同密度设备上的显示大小符合预期。你观察到的尺寸刚好是原尺寸的3倍,对应如下场景:
- 你的
eight_age图片大概率存放在默认的res/drawable(默认对应mdpi基准密度,缩放系数1.0)或者res/drawable-mdpi目录下 - 你当前测试设备的屏幕密度为xxhdpi,对应缩放系数3.0,系统自动将图片放大3倍后渲染,ImageView设置
wrap_content时会匹配放大后的图片尺寸,最终得到726x942的控件大小。
解决方法
若要让ImageView尺寸与原图像素大小完全一致,可根据场景选择以下任意一种方案:
方案1:修改资源存放目录(最推荐,无需改动布局代码)
直接将eight_age图片移动到res/drawable-nodpi目录下,若无该目录可手动新建。
存放在nodpi目录的资源不会被系统执行任何密度缩放,加载后的drawable尺寸与原图像素完全一致,此时ImageView保持wrap_content属性即可得到预期尺寸。
方案2:布局直接固定像素尺寸(适合不想改动资源存放位置的场景)
修改ImageView的属性,直接固定像素尺寸并禁用图片缩放:
<ImageView android:id="@+id/imageView" android:layout_width="242px" android:layout_height="314px" android:scaleType="center" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/eight_age" />
其中scaleType="center"代表不缩放图片,直接按原像素大小居中显示在控件内。
方案3:代码动态禁用缩放(适合需要灵活加载资源的场景)
加载图片时通过配置解码参数禁用密度缩放,再设置给ImageView:
// Java示例 BitmapFactory.Options options = new BitmapFactory.Options(); options.inScaled = false; Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.eight_age, options); imageView.setImageBitmap(bitmap);
布局保持原有的wrap_content属性即可。
内容的提问来源于stack exchange,提问作者AndLightLight
相关产品推荐
相关产品推荐

