ConstraintLayout中ImageView吸附到父布局顶部而非自定义View底部如何解决
问题根因
DrawCharacterView 自定义View的构造函数未将属性集AttributeSet和样式参数正确传递给父类View,导致布局中配置的300dp固定宽高未正常生效,系统测量该自定义View的高度为0。ConstraintLayout会判定该自定义View的底部和父布局顶部位置重合,因此绑定到其底部的ImageView会吸附到父布局顶部。
修复方案
修改DrawCharacterView.kt的构造函数,将参数完整传递给父类即可:
class DrawCharacterView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr)
修改后重新编译运行,ImageView就会正确显示在自定义View的下方。
可选优化
如果后续需要适配wrap_content等非固定尺寸的布局配置,可以额外重写onMeasure方法主动测量View尺寸,避免出现布局错乱:
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { // 示例:设置wrap_content时的默认最小尺寸为200dp,可按需调整 val minWidth = paddingLeft + paddingRight + dp2px(200) val minHeight = paddingTop + paddingBottom + dp2px(200) setMeasuredDimension( resolveSize(minWidth, widthMeasureSpec), resolveSize(minHeight, heightMeasureSpec) ) } // 工具方法:dp转px private fun dp2px(dp: Int): Int { return (dp * Resources.getSystem().displayMetrics.density).toInt() }
内容的提问来源于stack exchange,提问作者Andrew Stromme
相关产品推荐
相关产品推荐

