You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.21 16:16:02