如何在自定义ImageView类中编程实现固定宽高
编程实现固定宽高自定义ImageView
XML中写固定20dp宽高的本质,是布局加载时把dp值转成对应设备的像素值,在View测量阶段强制用这个值作为最终宽高。代码实现只要复现这个逻辑即可。
核心逻辑
重写View的onMeasure方法,跳过默认的测量逻辑,直接调用setMeasuredDimension传入提前转好的固定像素宽高即可。
完整代码
import android.content.Context import android.util.AttributeSet import android.util.TypedValue import androidx.appcompat.widget.AppCompatImageView class CustomView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : AppCompatImageView(context, attrs, defStyleAttr) { // 固定宽高,单位dp,和XML示例的20dp对应 private val fixedSizeDp = 20f // 初始化时完成dp到px的转换,适配当前设备屏幕密度 private val fixedSizePx: Int = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, fixedSizeDp, resources.displayMetrics ).toInt() override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { // 忽略传入的测量规则,直接设置固定宽高 setMeasuredDimension(fixedSizePx, fixedSizePx) } }
注意点
- 不要直接硬写像素值,必须用
TypedValue.applyDimension做dp转px,否则不同dpi设备上显示的实际大小会有偏差。 - 用
AppCompatImageView做父类可以兼容低版本系统的ImageView特性,和日常XML引用ImageView的表现一致。 - 写完这个自定义View后,不管你在XML里给它设置
wrap_content、match_parent还是其他尺寸值,最终渲染出来都是固定20dp*20dp的大小,和直接在XML写固定宽高的效果完全一致。
内容的提问来源于stack exchange,提问作者Charles Overflow
相关产品推荐
相关产品推荐

