单独的checkbox如何居中

2,376 阅读1分钟

需求是让单独的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() 获取图片宽度(跟设备有关,像素密度不同,值也不一样)