需求是让单独的checkbox居中
- 实际效果

- 明显不符合要求,
解决办法
- 自定义一个控件,extends Checkbox
- 示例:
class MyCustomCheckbox :CheckBox{
constructor(context:Context):this(context,null)
constructor(context:Context,attrs:AttributeSet?):this(context,attrs,0)
constructor(context:Context,attrs:AttributeSet?,defStyleAttr:Int): super(context,attrs,defStyleAttr)
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
var drawables = compoundDrawables
var drawable = drawables[0]
var gravity = gravity
var left = 0
if (Gravity.CENTER== gravity){
left = (((getWidth() - drawable.getIntrinsicWidth() - getPaint().measureText(getText().toString()))
/ 2).toInt())
}
drawable.setBounds(left, 0, left + drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight())
}
}
- 然后再xml里面进行设置
-
<safeluck.drive.evaluation.customview.MyCustomCheckbox android:layout_width="0dp" android:layout_weight="1" android:gravity="center" android:button="@null" android:layout_gravity="center_vertical" android:drawableStart="@drawable/ic_check" android:id="@+id/signal_check_1" android:layout_height="@dimen/ui_margin_30dp" android:checked="true"/>
就可以达到我们想要的效果;

几点解释:
- xml里面gravity设置不可以少
android:drawableStart="@drawable/ic_check"也是需要的- 主要代码
if (Gravity.CENTER== gravity){
left = (((getWidth() - drawable.getIntrinsicWidth() - getPaint().measureText(getText().toString()))
/ 2).toInt())
}
drawable.getIntrinsicWidth()获取图片宽度(跟设备有关,像素密度不同,值也不一样)