自定义 View 有两种方法:
继承 View
的子类,如TextView
;
直接继承 View
类。需要自己绘制 UI 元素。
继承 View 的子类
重写一些方法。
直接继承 View
onSizeChanged()
onDraw()
绘制 View 的形状、样式。
invalidate()
重绘 View。
为优化性能,在onDraw()
方法执行前分配变量,指定所需要的值。
重写performClick()
来提供点击事件。
使用自定义 View
就像自带的 View 一样使用。
自定义属性
新建value/attrs.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="DialView">
<attr name="fanColor1" format="color" />
<attr name="fanColor2" format="color" />
<attr name="fanColor3" format="color" />
</declare-styleable>
</resources>
name
建议为自定义 View 类的名称。
布局 XML 中,赋值:
app:fanColor1="#FFEB3B"
app:fanColor2="#CDDC39"
app:fanColor3="#009688"
自定义 View 类中,获得值:
context.withStyledAttributes(attrs, R.styleable.DialView) {
fanSpeedLowColor = getColor(R.styleable.DialView_fanColor1, 0)
fanSpeedMediumColor = getColor(R.styleable.DialView_fanColor2, 0)
fanSpeedMaxColor = getColor(R.styleable.DialView_fanColor3, 0)
}
withStyledAttributes()
报错:
Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6
解决:
app/build.gradle
:android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8.toString() } }