android使用kotlin自定义控件

定义一个类,继承Android官方提供的控件,如View、TextView、LinearLayout……代码如下:

class CustomerView(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(
    context,
    attrs,
    defStyleAttr
) {
    init {
        TODO("初始化操作")
    }
}

如果想自己用画布和画笔去画界面,那就重写onDraw方法,例如:

override fun onDraw(canvas: Canvas?) {
    super.onDraw(canvas)
    val paint = Paint().apply {
        color = Color.BLUE
        textSize = 18f
    }
    canvas?.drawText("我就试试", 50f, 50f, paint)
}

比较方便的做法当然是使用布局文件了。使用布局文件,自定义的控件类要继承ViewGroup或ViewGroup的子类。举个例子:

class CustomerView(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(
    context,
    attrs,
    defStyleAttr
) {
    init {
        inflate(context, R.layout.hy_title_bar, this)
    }
}

如果需要自定义属性,首先在res/values/attrs.xml中定义:

    <declare-styleable name="CustomerView">
        <attr name="myTextSize" format="dimension"/>
        <attr name="myTextColor" format="reference|color"/>
        <attr name="myTextLeft" format="string"/>
        <attr name="myTextTop" format="string"/>
        <attr name="myTextRight" format="string"/>
        <attr name="myTextBottom" format="string"/>
    </declare-styleable>

然后在CustomerView去初始化属性的值:

init {
    inflate(context, R.layout.hy_title_bar, this)
    val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomerView)
    TODO("获取设置的值,并做一些操作")
    typedArray.recycle()
}

Comment

您的电子邮箱地址不会被公开。 必填项已用 * 标注