决定由浅入深的来学习与Android自定义控件有关的知识。首先先从如何设置自定义控件的属性开始吧。
实现的效果:
像系统控件一样,可以在布局文件中设置控件的属性。
实现步奏:
一、在res/values中添加
二、在布局文件中引用
三、在代码中取值
下面开始具体的详细步奏:
一、在res/values中添加
在res/ values/ attrs xml文件中添加如下字段:(若没有该文件,则创建)
内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="一般为自定义控件的名字">
<attr name="自定义名称"
format="在布局文件中需要输入的值的类型,详见下表"/>
<attr name="width"
format="dimension"/>
...
</declare-styleable>
</resources>
1.定义:
<declare-styleable name="My"> <attr name="label" format="reference"> </declare-styleable> |
2.使用:
1 | <Buttonzkx:label="@string/label"> |
二、Color:颜色
1.定义:
1 2 3 | <declare-styleable name="My"> <attr name="textColor" format="color"/> </declare-styleable> |
2.使用:
1 | <Button zkx:textColor="#ff0000"/> |
三、boolean:布尔值
1.定义:
1 2 3 | <declare-styleable name="My"> <attr name="isVisible" format="boolean"/> </declare-styleable> |
2.使用:
1 | <Button zkx:isVisible="false"/> |
四、dimension:尺寸值
1.定义:
1 2 3 | <declare-styleable name="My"> <attr name="myWidth" format="dimension"/> </declare-styleable> |
2.使用:
1 | <Button zkx:myWidth="100dip"/> |
五、float:浮点型
1.定义:
1 2 3 | <declare-styleable name="My"> <attr name="fromAlpha" format="float"/> </declare-styleable> |
2.使用:
1 | <alpha zkx:fromAlpha="0.3"/> |
六、integer:整型
1.定义:
1 2 3 | <declare-styleable name="My"> <attr name="frameDuration" format="integer"/> </declare-styleable> |
2.使用:
1 | <animated-rotate zkx:framesCount="22"/> |
七、string:字符串
1.定义:
1 2 3 | <declare-styleable name="My"> <attr name="Name" format="string"/> </declare-styleable> |
2.使用:
1 | <rotate zkx:pivotX="200%"/> |
八、fraction:百分数
1.定义:
1 2 3 | <declare-styleable name="My"> <attr name="pivotX" format="fraction"/> </declare-styleable> |
2.使用:
1 | <rotate zkx:Name="My name is zhang kun xiang"/> |
九、enum:枚举
1.定义:
1 2 3 4 5 | <declare-styleable name="My"> <attr name="language"> <enum name="English" value="1"/> </attr> </declare-styleable> |
2.使用:
1 | <Button zkx:language="English"/> |
十、flag:位或运算
1.定义:
1 2 3 4 5 6 | <declare-styleable name="My"> <attr name="windowSoftInputMode"> <flag name="stateUnspecified" value="1"/> <flag name = "adjustNothing" value = "0x30"/> </attr> </declare-styleable> |
2.使用:
1 | <activity android:windowSoftInputMode="stateUnspecified | adjustNothing"> |
属性定义时可以指定多种类型值:
1 2 3 | <declare-styleable name = "名称"> <attr name="background" format="reference|color"/> </declare-styleable> |
使用:
1 | <ImageView android:background = "@drawable/图片ID|#00FF00"/> |
注:以上汇总列表引用自nicGithub大神的declare-styleable:自定义控件的属性
二、在布局文件中引用
引用之前需要先做声明,就像是我们常见到的系统声明:xmlns:android="http://schemas.android.com/apk/res/android"这句话一样。
位置可以和系统声明放在一起,一般的声明规则如下:
xmlns:attrs中该控件定义的name值="http://schemas.android.com/apk/res/应用包名”
其中蓝色文字为自己定义的内容。
然后在自己的控件中使用步奏一定义好的属性:
<com.example.demo.MyView
android:id="@+id/MyView"
attrs中该控件定义的name值:自定义属性名="值"
android:layout_height="match_parent"
android:layout_width="match_parent"
/>
三、在代码中取值
在自定义控件的带AttributeSet参数的构造函数中调用该方法即可:
private void getFromAttributes(Context context, AttributeSet attrs) {
//获得属性集的引用
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.Animation);
try {
if (a != null) {
//get你设置的属性类型,并把它赋值给你需要赋值的对象.例如这句话就是通过a.getColor()方法获取到在布局文件中赋的值。然后将该颜色值设置给画笔。
//注意:a.getColor()方法的第二个参数是当布局文件中没有赋值时的默认值。
mPaint.setColor(a.getColor(R.styleable.Animation_circle,
0xffffffff));
mPaint.setStrokeWidth(a.getDimension(R.styleable.Animation_width, 1));
}
} finally {
if (a != null) {
a.recycle();
}
}
}