Android 自定义控件的属性使用

    xiaoxiao2021-03-25  65

    一 性 介绍与应用

    最近项目中经常需要用到自定义控件,因此自定义属性也是经常要用到的,在此说明一下自定义属性的用法:

    自定义属性都存在于/value/attr.xml文件中,以如下格式存在。

    复制代码代码如下: <resource>

    <declare-styleable name="自定义属性名称">

    <attr name="属性名称" format="属性种类"/>

    ......

    </declare-styleable>

    </resource>

    对于自定义属性中的format的值及其含义如下:

    format属性值:reference 、color、boolean、dimension、float、integer、string、fraction、enum、flag

    1. reference:参考某一资源ID。

    (1)属性定义:

    复制代码代码如下: <declare-styleable name = "名称">

    <attr name = "background" format = "reference" />

    </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <ImageView

    android:layout_width="42dip" android:layout_height="42dip" android:background="@drawable/图片ID" />

    2.color:颜色值。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="名称">

    <attrname="textColor"format="color"/>

    </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <TextView android:layout_width="42dip" android:layout_height="42dip" android:textColor="#00FF00" />

    3.boolean:布尔值。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="名称">

    <attrname="focusable"format="boolean"/>

    </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <Button android:layout_width="42dip" android:layout_height="42dip" android:focusable="true" />

    4.dimension:尺寸值。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="名称">

    <attrname="layout_width"format="dimension"/>

    </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <Button android:layout_width="42dip" android:layout_height="42dip" />

    5.float:浮点值。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="AlphaAnimation"> <attrname="fromAlpha"format="float"/> <attrname="toAlpha"format="float"/> </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <alpha android:fromAlpha="1.0" android:toAlpha="0.7" />

    6.integer:整型值。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="AnimatedRotateDrawable"> <attrname="visible"/> <attrname="frameDuration"format="integer"/> <attrname="framesCount"format="integer"/> <attrname="pivotX"/> <attrname="pivotY"/> <attrname="drawable"/> </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/图片ID" android:pivotX="50%" android:pivotY="50%" android:framesCount="12" android:frameDuration="100" />

    7.string:字符串。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="MapView"> <attrname="apiKey"format="string"/> </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <com.google.android.maps.MapView android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />

    8.fraction:百分数。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="RotateDrawable"> <attrname="visible"/> <attrname="fromDegrees"format="float"/> <attrname="toDegrees"format="float"/> <attrname="pivotX"format="fraction"/> <attrname="pivotY"format="fraction"/> <attrname="drawable"/> </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <rotate xmlns:android="http://schemas.android.com/apk/res/android"   android:interpolator="@anim/动画ID"

    android:fromDegrees="0" android:toDegrees="360"

    android:pivotX="200%"

    android:pivotY="300%" android:duration="5000"

    android:repeatMode="restart"

    android:repeatCount="infinite"

    />

    9.enum:枚举值。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="名称"> <attrname="orientation"> <enumname="horizontal"value="0"/> <enumname="vertical"value="1"/> </attr> </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> </LinearLayout>

    10.flag:位或运算。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="名称"> <attrname="windowSoftInputMode"> <flagname="stateUnspecified"value="0"/> <flagname="stateUnchanged"value="1"/> <flagname="stateHidden"value="2"/> <flagname="stateAlwaysHidden"value="3"/> <flagname="stateVisible"value="4"/> <flagname="stateAlwaysVisible"value="5"/> <flagname="adjustUnspecified"value="0x00"/> <flagname="adjustResize"value="0x10"/> <flagname="adjustPan"value="0x20"/> <flagname="adjustNothing"value="0x30"/> </attr> </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <activity android:name=".StyleAndThemeActivity" android:label="@string/app_name" android:windowSoftInputMode="stateUnspecified|stateUnchanged | stateHidden"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>

    特别要注意:

    属性定义时可以指定多种类型值。

    (1)属性定义:

    复制代码代码如下: <declare-styleablename="名称"> <attrname="background"format="reference|color"/> </declare-styleable>

    (2)属性使用:

    复制代码代码如下: <ImageView android:layout_width="42dip" android:layout_height="42dip" android:background="@drawable/图片ID|#00FF00" />

    下面说说AttributeSet与TypedArray在自定义控件中的作用:

    AttributeSet的作用就是在控件进行初始化的时候,解析布局文件中该控件的属性(keyeg:background)与该值(valueeg:@drawable/icon)的信息封装在AttributeSet中,传递给该控件(View)的构造函数。对于非Android自带的属性,在View类中处理时是无法识别的,因此需要我们自己解析。所以这就要用到另外一个类TypedArray。在AttributeSet中我们有属性名称,有属性值,但是控件如何知道哪个属性代表什么意思呢?这个工作就由TypedArray来做了。TypedArray对象封装了/values/attrs.xml中的styleable里定义的每个属性的类型信息,通过TypedArray我们就可以知道AttributeSet中封装的值到底是干什么的了,从而可以对这些数据进行应用。

    AttributeSet就相当于一盒糖,TypedArray就相当于这盒糖上的标签说明,告诉用户每个糖的口味等。这盒糖有什么口味是由用户自己的styleable文件里面的内容来决定的。

    来源: <http://www.jb51.net/article/48962.htm> 二、自定义属性的应用

    让我们再来看看布局xml中需要注意的事项。

    首先得声明一下:xmlns:mytool(名字可以任意)=http://schemas.android.com/apk/res/cn.zzm.toolbar (自定义包名) 注意,“mytool”可以换成其他的任何名字,后面的url地址必须最后一部分必须用上自定义组件的包名。自定义属性了,在属性名前加上“mytool”即可。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:CommonText="http://schemas.android.com/apk/res-auto" //对与自定义属性的引用可以直接使用这个     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="@drawable/bg"     android:orientation="vertical" >

    使用自定义的时候,有两种方式 AttributeSet 来获取属性或者 TypedArray

    [html]  view plain  copy <span style="color: rgb(51, 51, 51);">   </span><span style="color:#ff0000;"> private static final String ATTRS = "http://schemas.android.com/apk/res-auto";</span><span style="color:#333333;">       private TextView tv_setting_update;          public SetItemView(Context context) {           super(context);          }       public SetItemView(Context context, AttributeSet attrs) {           super(context, attrs);            init();           //设置图标           int set_icon = attrs.getAttributeResourceValue(ATTRS, "set_icon", 0);           //设置内容           String set_content = attrs.getAttributeValue(ATTRS, "set_content");           //设置更新内容           String set_update = attrs.getAttributeValue(ATTRS, "set_update");           //设置箭头           int arrow = attrs.getAttributeResourceValue(ATTRS, "set_arrow", 0);           if (set_icon != 0) {               setIv_icon(set_icon);           }           if (arrow != 0) {               setIv_arrow(arrow);           }           if (!TextUtils.isEmpty(set_update)) {               tv_setting_update.setVisibility(View.VISIBLE);               setTv_setting_update(set_update,false);              }           if (!TextUtils.isEmpty(set_content)) {               setTv_content(set_content);           }       }   public void setIv_icon(int iv_icon) {           this.iv_setting_icon.setBackgroundResource(iv_icon);       }          public void setTv_content(String tv_content) {           this.tv_setting_content.setText(tv_content);       }   ...</span>   [html]  view plain  copy <span style="color:#333333;">使用:</span>   [html]  view plain  copy <span style="color:#333333;"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     </span><span style="color:#ff0000;">  xmlns:itemView="http://schemas.android.com/apk/res-auto"</span><span style="color:#333333;">       android:layout_width="match_parent"       android:layout_height="match_parent"       android:background="@drawable/bg_setting"       android:orientation="vertical">              <com.xxx.widget.SetItemView               android:id="@+id/setItem_mapManger"               android:layout_width="fill_parent"               android:layout_height="wrap_content"             </span><span style="color:#ff0000;">  itemView:set_arrow="@drawable/img_arrow"               itemView:set_content="商城地图管理"               itemView:set_icon="@drawable/icon_setting_0" /></span>  

    另一种通过TypedArray来实现的

    [html]  view plain  copy <span style="color:#333333;">/**    * 属性 参数的配置 自己 到attrs 文件去配置    * 如果 不需要 就不要 get set 自己选择性的 重写    */   public class MyTextView extends LinearLayout{      private String mTextInfo;       private int mTextColor;       private  float mTextSize;       private TextView tv_info;               private TextView tv_num;       private String mTextNum;       public MyTextView(Context context) {           super(context);           init();       }          public MyTextView(Context context, AttributeSet attrs) {           super(context, attrs);           TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CommonText);           //属性名CommonText 后面加上参数 _(参数名)           mTextNum = a.getString(R.styleable.CommonText_textNum);            mTextInfo = a.getString(R.styleable.CommonText_textInfo);           mTextColor = a.getColor(R.styleable.CommonText_textColor, 0XFFFFFFFF);           mTextSize = a.getDimensionPixelSize(R.styleable.CommonText_textSize, 0);           init();           a.recycle();       }               private void init() {        </span><span style="color:#ff0000;">   View.inflate(getContext(), R.layout.my_text_view, this);</span><span style="color:#333333;">           tv_info = (TextView) findViewById(R.id.tv_info);           tv_num = (TextView) findViewById(R.id.tv_num);           if (mTextInfo!=null) {                setTv_info(mTextInfo);           }           if (mTextNum!=null) {               setTv_num(mTextNum);           }           if (mTextColor!=0) {               tv_info.setTextColor(Color.WHITE);               tv_num.setTextColor(Color.WHITE);           }                }       public TextView getTv_info() {           return tv_info;       }          public void setTv_info(String tv_info) {           this.tv_info.setText(tv_info);       }          public TextView getTv_num() {           return tv_num;       }          public void setTv_num(String tv_num) {           this.tv_num.setText(tv_num);       }      }</span>  

    属性文件

    [html]  view plain  copy <?xml version="1.0" encoding="utf-8"?>   <resources>       <declare-styleable name="CommonText">           <attr name="textNum" format="string"></attr>           <attr name="textInfo" format="string"></attr>           <attr name="textColor" format="color"></attr>           <attr name="textSize" format="dimension"></attr>       </declare-styleable>   </resources>   使用

    [html]  view plain  copy <com.xx.userstateinfo.MyTextView              android:layout_width="wrap_content"              android:layout_height="wrap_content"              CommonText:textInfo="关注"              CommonText:textNum="100" >          </com.xx.userstateinfo.MyTextView>   [html]  view plain  copy   

    源码地址:http://download.csdn.net/detail/mr_kings/9094921

    转载请注明原文地址: https://ju.6miu.com/read-34007.html

    最新回复(0)