在自定义控件的时候,如果我们想额外的添加一些属性,就会用到TypedArray这个类,那么这个类是怎么得到的,以及怎么使用的,这里作个简单介绍。
创建自定义属性首先创建values\attrs.xml,在attrs.xml中声明自定义属性:
自定义string类型,属性名为text
自定义color类型,属性名为textColor
自定义dimension类型,属性名为textSize
declare-styleable这个标签的作用其实就是可以为我们完成很多常量(int[]数组,下标常量)等的编写,简化我们的开发工作
format还有如下类型:
format | 介绍 |
---|---|
reference | 表示引用,参考某一资源ID |
string | 表示字符串 |
color | 表示颜色值 |
dimension | 表示尺寸值 |
boolean | 表示布尔值 |
integer | 表示整型值 |
float | 表示浮点值 |
fraction | 表示百分数 |
enum | 表示枚举值 |
flag | 表示位运算 |
自定义空间在xml里面布局的时候引用自定义的属性。
CustomView是自定义控件,引用了app:text、app:textColor、 app:textSize="18sp"三个自定义属性
当然,起作用的前提是,要在自定义的view里面处理:
public class CustomView extends View {
public Paint paint;
private String text = "";//文本内容
private int textColor = 0xDD333333; //字体颜色
private float textSize = 20;//字体大小设置
public CustomView(Context context) {
this(context, null);
}
public CustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
private void init(AttributeSet attrs) {
TypedArray a = getResources().obtainAttributes(attrs, R.styleable.MyFirstCustomerView);//获取TypedArray
textColor = a.getColor(R.styleable.CustomerView_textColor, textColor);//获取布局中设置的自定以颜色
textSize = a.getDimension(R.styleable.CustomerView_textSize, textSize);//获取布局中设置的自定义字体大小
text = a.getString(R.styleable.CustomerView_text);//获取布局中设置的自定义文本
paint = new Paint();//初始化 画笔
paint.setTextSize(textSize);//画笔字体大小设置
paint.setColor(textColor);//画笔的颜色
paint.setStyle(Paint.Style.FILL);//画笔风格
a.recycle();//切记:在使用TypedArray后需要回收
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText(text, 100, 100, paint);
}}
-TypedArray用完一定要回收。其实obtainAttributes()底层是native方法,也就是用C++实现的,他会提取自定义控件属性的的值保存TypedArray中的mData数组中,这个数组的大小是由你定义控件属性的个数决定的,是它的6倍,上面的attrs其实就是你自定义属性的个数。
Context | 当前上下文 |
AttributeSet | 为xml里一个节点下面的属性的集合,这个类一般都是系统在生成有xml配置的组件时生成,可以理解为当前自定义控件下的所有属性集合;提供TypedArray检索的范围 |
defStyleAttr |
在当前包含了一个引用到为TypedArray提供默认值的样式资源的theme中的一种属性。可以为0,但是为0的时候就不会再去寻找默认的;提供TypedArray检索的范围(注:这里的默认也就是defStyleRes) |
作者:Jason_Lee155