定义一个类,继承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()
}