ImageView是Android 中图片加载显示最常用的控件之一,而scaleType属性就决定图片的显示属性,比如是否进行缩放、等比缩放、缩放后展示位置等。Android 提供了八种scaleType的属性值,每种都对应了一种展示方式。
ScaleType可大体分为三类:
(1) 以fit_开头的4种,共同点是都会对图片进行缩放;
(2) 以center_开头的3种,共同点是居中显示,图片的中心点会与ImageView的中心点重叠;
(3) ScaleType.MATRIX,就是最简单的显示;
1、android:scaleType=“matrix”
表示不改变原图的大小,从ImageView的左上角开始绘制原图,原图超过ImageView的部分作裁剪处理。 ---没有缩放,只从图片左上角开始绘制,ImageView控件尺寸显示范围内保存超过部分剪切
2、android:scaleType=“center”
(1)当图片大于ImageView的宽高:以图片的中心点和ImageView的中心点为基准,按照图片的原大小居中显示,不缩放,用ImageView的大小截取图片的居中部分。---没有缩放,中心点和ImageVIew控件对齐
(2)当图片小于ImageView的宽高:直接居中显示该图片。
3、android:scaleType=“centerCrop”
(1)当图片大于ImageView的宽高:以图片的中心点和ImageView的中心点为基准,按比例缩小图片,直到图片的宽高有一边等于ImageView的宽高,则对于另一边,图片的长度大于或等于ImageView的长 度,最后用ImageView的大小居中截取该图片。
(2)当图片小于ImageView的宽高:以图片的中心店和ImageView的中心点为基准,按比例扩大图片,直到图片的宽高大于或等于ImageView的宽高,并按ImageView的大小居中截取该图片。
4、android:scaleType=“centerInside”
(1)当图片大于ImageView的宽高:以图片的中心和ImageView的中心点为基准,按比例缩小图片,使图片宽高等于或者小于ImagevView的宽高,直到将图片的内容完整居中显示。
(2)当图片小于ImageView的宽高:直接居中显示该图片。
5、android:scaleType=“fitXY”
表示把图片按指定的大小在ImageView中显示,拉伸或收缩图片,不保持原比例,填满ImageView。
6、android:scaleType=“fitStart”
表示把图片按比例扩大(缩小)到ImageView的宽度,在ImageView的上方显示。
7、android:scaleType=“fitCenter”
表示把图片按比例扩大(缩小)到ImageView的宽度,居中显示。
8、android:scaleType=“fitEnd”
表示把图片按比例扩大(缩小)到ImageView的宽度,在ImageView的下方显示。
| 属性 | 缩放 | 裁切 | 对齐位置 | 一定铺满ImageView | 拉伸变形 | 大图片 | 小图片 |
|---|---|---|---|---|---|---|---|
| center | 无 | 有 (大图超过IV宽高部分裁切) | IV中心点 | 否 (小图片:四周可能留白) | 否 | 图片中心点和IV对齐,不缩放,超过IV大小区域裁切掉 | 图片中心点和IV对齐,不缩放,四周可能留白 |
| centerCrop | 有 (大图缩小; | 有 (大图缩小到有一边和IV对齐,另一边裁切;小图放大两边都大等于IV,大的一边裁切掉) | IV中心点 | 是 | 否 | 图片中心点和IV对齐,缩小,直到图片宽高一边等于IV的宽高,另一边超过IV部分裁切掉 | 图片中心点和IV对齐,放大,直到图片宽高都大等于IV宽高,另一边超过IV部分裁切掉 |
| centerInside | 有 (大图缩小; | 无 | IV中心点 | 否 (顶部、底部可能留白) | 否 | 图片中心点和IV对齐,缩小,直到图片宽高都小于IV宽高 | 图片中心点和IV对齐,原图 |
| fitXY | 有 | 无 (图片被拉伸变形) | IV左上角 | 是 | 是 | 拉伸变形 | 拉伸变形 |
| fitStart | 有 | 无 | IV顶边 | 否 (中部、底部可能留白) | 否 | 缩小图片直到宽度和IV对齐,高度忽略 --正常图片比例 | 放大图片直到宽度和IV对齐,高度忽略 --正常图片比例 |
| fitCenter | 有 | 无 | IV中线 | 否 (顶部、底部可能留白) | 否 | ||
| fitEnd | 有 | 无 | IV底边 | 否 (顶部、中部可能留白) | 否 | ||
| fitStart | 有 | 无 | IV左边 | 否 (中部、右边可能留白) | 否 | 缩小图片直到高度和IV对齐,宽度忽略 --竖图(宽高比小于1的图片) | 放大图片直到高度和IV对齐,宽度忽略 --竖图(宽高比小于1的图片) |
| fitCenter | 有 | 无 | IV中线 | 否 (左边、右边可能留白) | 否 | ||
| fitEnd | 有 | 无 | IV右边 | 否 (左边、中部可能留白) | 否 | ||
| matrix(默认) | 无 | 有 | IV左上角 | 否 (小图片可能四周留白) | 否 | 图片左上角和IV左上角对齐,不缩放,超过部分自动裁剪, | 图片左上角和IV左上角对齐,不缩放,有空白 |
陪图说明
原图:
尺寸:50*50
尺寸:950*633
简单分析:fitCenter和centerInside,根据上面的效果图来分析,
fitCenter是将原图等比例放大或缩小,使原图的高度等于ImageView的高度,并居中显示,而centerInside在原图的原本size大于ImageView的size时,则缩小原图,效果同fitCenter;在原图的原本size小于ImageView的size时,则不进行任何size处理,居中显示,效果同center。
ImageView的android:adjustViewBounds属性为是否保持原图的长宽比,单独设置不起作用,需要配合maxWidth或maxHeight一起使用。
Android .9 图 + ImageView scaleType 配合总结
核心:.9 图负责【哪些区域拉伸、哪些固定】;scaleType 负责【图片在 ImageView 容器里怎么摆放、缩放】,两者独立生效,会互相影响9 图本质:在 png 四周黑线标记:可拉伸区域、内容内边距 (padding)
一、先回顾 9 图规则(.9.png)
- 上边黑线:水平方向可拉伸区域
- 左边黑线:垂直方向可拉伸区域
- 下边黑线:内容水平 padding(文字 / 子内容放这里)
- 右边黑线:内容垂直 padding
非黑线区域永远不会被拉伸,保持原始比例大小。
二、ImageView ScaleType 对 9 图的影响
1.fitXY(最常用搭配 9 图,按钮背景)
- 行为:不保持原图比例,强行把图片拉伸填满 ImageView 宽高
- ✅ 适合:圆角按钮、气泡背景、弹窗背景(.9 背景)
- 原理:fitXY 会把整张图片拉伸,但9 图会控制只有标记区域被拉,边角保持不变形
这就是为什么气泡圆角用
.9 + fitXY,放大缩小圆角不变形。 注意:如果不用 9 图,fitXY 直接整张图拉伸,圆角会被拉变形。
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/bubble.9.png" android:scaleType="fitXY"/>2.fitCenter(默认 scaleType)
- 行为:保持图片原始宽高比,等比缩放,居中,不超出 View 边界
- ⚠️ 和 9 图搭配很少用:9 图会优先按原图比例缩放,不会撑满控件;
适合:9 图作为内容图,不是背景。不适合气泡、按钮背景
3.center
- 原图不缩放,图片原始像素大小,直接居中放在 ImageView
- 如果 ImageView 比图片大:9 图不会拉伸,只居中展示原图大小
适合:固定大小标识,不需要拉伸背景
4.centerCrop
- 等比放大图片填满 View,超出部分裁剪
- ❌基本不要搭配 9 图做背景:会裁切 9 图的标记区域,容易导致拉伸异常、圆角被裁。
5.centerInside
- 原图等比缩小,完整显示全部图片,不裁剪;View 大于原图时,图片居中不放大。
9 图不会被拉伸,仅缩小。
6. matrix
- 手动矩阵控制缩放位移,一般不与 9 图一起使用,容易打乱拉伸区域。
三、重要区分:android:srcvsandroid:background
很多人踩坑!
- background设置.9 图: background 自带
fitXY逻辑,不需要设置 scaleType,scaleType 只对src生效!android:background="@drawable/btn_bg.9.png" - src设置.9 图: 才会受
scaleType控制!
坑点:background 不支持内容 padding;9 图定义的 padding,只有用 src 方式加载才会生效。
四、推荐组合(工程常用)
- ✅ 聊天气泡、按钮背景(src 方式,需要 9 图内边距)
android:src="@drawable/bubble.9.png" android:scaleType="fitXY" android:layout_width="wrap_content" android:layout_height="wrap_content"- ✅ 普通背景(不需要读取 9 图 padding):直接 background,不用 scaleType
android:background="@drawable/bg.9.png"- ❌ 禁止组合:
.9图 + centerCrop,极易裁剪边框。
五、常见踩坑
- 9 图放到 src,没写 scaleType,默认
fitCenter→ 背景不会撑满控件 - background 设置 9 图,然后写 scaleType → scaleType 完全无效,白写
- 9 图黑线画错 + fitXY:不该拉伸的圆角被拉伸,出现模糊变形
- 文件名:必须
xxx.9.png;不能在其他文件夹下重命名,AS 会识别失败
六、一句话总结
- 用
.9做src 图片,想要撑满控件、保留圆角不变形 →scaleType="fitXY" - 用
.9做background:不受 scaleType 控制,自带 fitXY 拉伸 - centerCrop/fitCenter 适合普通图片,不适合 9 图背景拉伸场景