前言
原生View不满足我们的业务需求,我们要自定义View
自定义View基础
类型 | 定义 |
---|---|
自定义组合控件 | 多个控件组合成为一个新的控件,方便多处复用 |
继承系统View控件 | 继承自TextView等系统控件,在系统控件的基础功能上进行扩展 |
继承View | 不复用系统控件逻辑,继承View进行功能定义 |
继承系统ViewGroup | 继承自LinearLayout等系统控件,在系统控件的基础功能上进行扩展 |
View绘制流程
onMeasure
测量View的宽高
setMeasuredDimension() 设置View测量的高度
onLayout
计算当前View以及子View的位置
onDraw
视图的绘制工作
构造函数
public class TestView extends View {
/**
* 在java代码里new的时候会用到
* @param context
*/
public TestView(Context context) {
super(context);
}
/**
* 在xml布局文件中使用时自动调用
* @param context
*/
public TestView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
/**
* 不会自动调用,如果有默认style时,在第二个构造函数中调用
* @param context
* @param attrs
* @param defStyleAttr
*/
public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
自定义属性
自定义属性的声明文件 res/value/attrs.xml
<declare-styleable name="CustomView">
<attr name="valueColor" format="color" />
<attr name="valueText" format="string"/>
<attr name="valueSize" format="dimension"/>
</declare-styleable>
自定义View类 中获取自定义属性
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
String string = typedArray.getString(R.styleable.CustomView_valueText);
属性值的类型format
(1). reference:参考某一资源ID
(2). color:颜色值
(3). boolean:布尔值
(4). dimension:尺寸值
(5). float:浮点值
(6). integer:整型值
(7). string:字符串
(8). fraction:百分数
(9). enum:枚举值
(10). flag:位或运算