Skip to content

Android自定义View

Posted on:March 30, 2020 at 22:28:01 GMT+8

自定义 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()
 }
}