0%

Android自定义View

自定义 View 有两种方法:

继承 View 的子类,如TextView

直接继承 View 类。需要自己绘制 UI 元素。

继承 View 的子类

重写一些方法。

直接继承 View

onSizeChanged()

onDraw()

绘制 View 的形状、样式。

invalidate()

重绘 View。

为优化性能,在onDraw()方法执行前分配变量,指定所需要的值。

重写performClick()来提供点击事件。

使用自定义 View

就像自带的 View 一样使用。

自定义属性

新建value/attrs.xml

1
2
3
4
5
6
7
8
<?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 中,赋值:

1
2
3
app:fanColor1="#FFEB3B"
app:fanColor2="#CDDC39"
app:fanColor3="#009688"

自定义 View 类中,获得值:

1
2
3
4
5
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:

1
2
3
4
5
6
7
8
9
10
11
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}