经过更多研究,我最终达到了这个要求。
正如这里的一些人指出的那样,大多数地方给出的解决方案是这样的(转换为 kotlin):
class SquareButton(context: Context, attrs: AttributeSet) : Button(context, attrs) {
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val width: Int = MeasureSpec.getSize(widthMeasureSpec);
setMeasuredDimension(width, width)
}
}
场景中MeasureSpec.getSize 的问题在于(连同MeasureSpec.getMode)它包含宽度的大小调整“规则”。
在这种情况下:尺寸:(可用尺寸)+模式:(AT_MOST)=按钮允许的最大宽度
另一个选项是获取已由 Button 类计算的最小宽度:
class SquareButton(context: Context, attrs: AttributeSet) : Button(context, attrs) {
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val width: Int = measuredWidth
setMeasuredDimension(width, width)
}
}
getMeasuredWidth() 通过 setMeasuredDimension() 返回 onMeasure() 中设置的宽度测量值。
What is the difference between MeasureSpec.getSize(widthMeasureSpec) and getWidth()?
在调用super.onMeasure 时将measuredWidth 属性设置为wrap_content 值。这是宽度和高度的所需值。