您的位置:首页 > 移动开发 > Android开发

Android自定义View的自定义属性atrrs.xml解析

2017-05-18 15:04 357 查看
想要写出漂亮实用易用的自定义view,离不开自定义属性。那么如何才能做到像官方提供的那些组件一样用xml来定义他的属性呢?一、在res/values目录下建立atrrs.xml文件,代码格式如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="backColor" format="color"/>
<declare-styleable name="MyView">
<attr name="backColor"/>
</declare-styleable>
</resources>
或者
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="backColor" format="color"/>
</declare-styleable>
</resources>
该文件是定义属性名和格式的地方,需要用<declare-styleable name="MyView"></declare-styleable>包围所有属性。其中name为该属性集的名字,
主要用途是标识该属性集。<attr name="backColor" format="color"/>标签用于说明具体的属性,name为属性名称,format为属性值,比如此处就是color
就是用于颜色值。注意前一种写法,format写在属性集标签外时,属性集里的属性name要和集合外的属性name一致。此时不免有人会问,既然这样为什么
不直接用第二种写法。因为把属性的t写在属性集以外,是为了此属性能在其他的属性集合里也能复用。
二、在布局xml中如下使用该属性:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"><com.littlejie.circleprogress.CircleProgressandroid:id="@+id/circle_progress_bar1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"app:backColor="#112233" /></LinearLayout>
三、在自定义组件中,可以如下获得xml中定义的值:
public MyView(Context context, AttributeSet attrs) {super(context, attrs);TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.MyView);typedArray.getColor(R.styleable.MyView_backColor,0x000000);typedArray.recycle();}
在获取某属性标识时,用到"R.styleable.ToolBar_buttonNum",很显然,他在每个属性前面加上标识集的名称"MyView_"。
在来看看各种属性都有些什么类型吧:string , integer , dimension , reference , color , enum......
前面几种的声明方式都是一致的,例如:<attr name="buttonNum" format="integer"/>。 只有enum是不同的,用法举例:<attr name="testEnum"><enum name="fill_parent" value="-1"/><enum name="wrap_content" value="-2"/></attr>如果该属性可同时传两种不同的属性,则可以用“|”分割开即可。让我们再来看看布局xml中需要注意的事项。首先得声明一下:xmlns:app="http://schemas.android.com/apk/res-auto"最后来看看java代码中的注意事项。在自定义组件的构造函数中,用TypedArray typaArray= context.obtainStyledAttributes(attrs,R.styleable.ToolBar);来获得对属性集的引用,然后就可以用“typeArray”的各种方法来获取相应的属性值了。这里需要注意的是,如果使用的方法和获取值的类型不对的话,则会返回默认值。在取完值的时候别忘了回收资源哦typeArray.recycle()!1b52a自定义属性数据类型简介:一、reference:参考指定Theme中资源ID。1.定义:
123
    <declare-styleable name="My"><attr name="label" format="reference" ></declare-styleable>
2.使用:
1
<Button app:label="@string/label" >
二、Color:颜色1.定义:
123
    <declare-styleable name="My"><attr name="textColor" format="color" /></declare-styleable>
2.使用:
1
<Button app:textColor="#ff0000"/>
三、boolean:布尔值1.定义:
123
    <declare-styleable name="My"><attr name="isVisible" format="boolean" /></declare-styleable>
2.使用:
1
<Button app:isVisible="false"/>
四、dimension:尺寸值1.定义:
123
    <declare-styleable name="My"><attr name="myWidth" format="dimension" /></declare-styleable>
2.使用:
1
<Button app:myWidth="100dip"/>
五、float:浮点型1.定义:
123
    <declare-styleable name="My"><attr name="fromAlpha" format="float" /></declare-styleable>
2.使用:
1
<alpha app:fromAlpha="0.3"/>
六、integer:整型1.定义:
123
    <declare-styleable name="My"><attr name="frameDuration" format="integer" /></declare-styleable>
2.使用:
1
<animated-rotate app:framesCount="22"/>
七、string:字符串1.定义:
123
    <declare-styleable name="My"><attr name="Name" format="string" /></declare-styleable>
2.使用:
1
<rotate app:pivotX="200%"/>
八、fraction:百分数1.定义:
123
    <declare-styleable name="My"><attr name="pivotX" format="fraction" /></declare-styleable>
2.使用:
1
<rotate app:Name="My name is zhang kun xiang"/>
九、enum:枚举1.定义:
12345
    <declare-styleable name="My"><attr name="language"><enum name="English" value="1"/></attr></declare-styleable>
2.使用:
1
<Button app:language="English"/>
十、flag:位或运算1.定义:
123456
    <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">

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: