自定义ImageView设置ScaleType.MATRIX后图片缩小的原因及适配方案
关于AppCompatImageView设置ScaleType.MATRIX后图片缩小的问题解答
嘿,这个问题我之前做自定义ImageView的时候也踩过坑,咱们一步步来搞清楚原因和解决办法~
为什么设置ScaleType.MATRIX后图片会缩小?
当你用ImageView默认的ScaleType(比如FitCenter、CenterCrop这些)时,系统会自动帮你计算合适的缩放比例,让图片适配控件的尺寸,同时还能保持图片的宽高比。但一旦你把ScaleType设为MATRIX,ImageView就彻底“放权”了——它不会再自动做任何适配计算,默认会用单位矩阵来绘制图片。
单位矩阵是什么意思呢?就是图片会以它的原始尺寸直接绘制。如果你的图片原始尺寸比你的ImageView控件小,那自然就会显示得缩小;如果原始尺寸比控件大,那你只能看到图片的一部分。这就是为什么你一设置MATRIX就出现缩小情况的原因。
如何让使用ScaleType.MATRIX的ImageView初始适配屏幕?
既然系统不帮我们做适配了,那我们就手动计算缩放矩阵就行。关键是要在控件尺寸确定之后,根据图片和控件的宽高来计算合适的缩放比例和平移量,然后把这个矩阵设置给ImageView。
下面是修改后的MyImageView代码,直接就能用:
class MyImageView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : AppCompatImageView(context, attrs, defStyleAttr) { init { scaleType = ScaleType.MATRIX } override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) // 控件尺寸确定/变化时,重新计算适配矩阵 adjustImageMatrix() } private fun adjustImageMatrix() { // 先判断有没有设置图片,避免空指针 drawable ?: return val drawableWidth = drawable.intrinsicWidth.toFloat() val drawableHeight = drawable.intrinsicHeight.toFloat() val viewWidth = width.toFloat() val viewHeight = height.toFloat() // 计算缩放比例:这里用minOf是和默认FitCenter逻辑一致,让图片完整显示在控件内 // 如果想让图片填满控件(类似CenterCrop),把minOf改成maxOf就行 val scaleX = viewWidth / drawableWidth val scaleY = viewHeight / drawableHeight val scale = minOf(scaleX, scaleY) // 计算平移量,让图片在控件中居中 val translateX = (viewWidth - drawableWidth * scale) / 2f val translateY = (viewHeight - drawableHeight * scale) / 2f // 创建矩阵并应用缩放和平移 val matrix = Matrix() matrix.setScale(scale, scale) matrix.postTranslate(translateX, translateY) // 把矩阵设置给ImageView imageMatrix = matrix } }
代码说明:
- 我们在
onSizeChanged方法里处理适配,因为这个方法会在控件的宽高确定(或者变化)时被调用,能拿到准确的控件尺寸 - 计算缩放比例时,
minOf(scaleX, scaleY)会保证图片完整显示在控件内,和默认的FitCenter效果一样;如果想要图片铺满控件(裁剪超出部分),换成maxOf(scaleX, scaleY)就好 - 平移量的计算是为了让缩放后的图片在控件里居中显示,避免图片贴在角落
- 最后把计算好的矩阵设置给ImageView,这样初始状态下图片就会适配控件显示了,同时你还能在后续通过修改这个矩阵来实现自定义的图片变换(比如拖拽、缩放等)
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

