Android 中自定义属性(attr.xml,TypedArray)的使用

今天我们的教程是根据前面一节扩展进行的,如果你没有看,请点击  Android高手进阶教程(三) 查看第三课,这样跟容易方便你的理解!
在xml 文件里定义控件的属性,我们已经习惯了android:attrs="" ,那么我们能不能定义自己的属性能,比如:test:attrs="" 呢?答案是肯定的.
好了我就不卖关子了,直接进入主题。大致以下步骤:
一、 在res/values 文件下定义一个attrs.xml 文件.代码如下:
view plaincopy to clipboardprint?
一、在res/values文件下定义一个attrs.xml文件.代码如下:   
 
  
  
  
  
  1. <?xml version="1.0" encoding="utf-8"?>     
  2. <resources>     
  3.     <declare-styleable name="MyView">     
  4.         <attr name="textColor" format="color" />     
  5.         <attr name="textSize" format="dimension" />     
  6.     </declare-styleable>     
  7. </resources>    
二、 我们在MyView.java 代码修改如下,其中下面的构造方法是重点,我们获取定义的属性我们R.sytleable.MyView_textColor, 获取方法中后面通常设定默认值(float textSize = a.getDimension(R.styleable.MyView_textSize, 36 ); ), 防止我们在xml 文件中没有定义.从而使用默认值!
获取,MyView 就是定义在<declare-styleable name="MyView "></declare-styleable> 里的名字,获取里面属性用 名字_ 属性 连接起来就可以.TypedArray 通常最后调用 .recycle() 方法,为了保持以后使用该属性一致性!
view plaincopy to clipboardprint?
 
  
  
  
  
  1. public MyView(Context context,AttributeSet attrs)     
  2.     {     
  3.         super(context,attrs);     
  4.         mPaint = new Paint();     
  5.              
  6.         TypedArray a = context.obtainStyledAttributes(attrs,     
  7.                 R.styleable.MyView);     
  8.              
  9.         int textColor = a.getColor(R.styleable.MyView_textColor,     
  10.                 0XFFFFFFFF);     
  11.         float textSize = a.getDimension(R.styleable.MyView_textSize, 36);     
  12.              
  13.         mPaint.setTextSize(textSize);     
  14.         mPaint.setColor(textColor);     
  15.              
  16.         a.recycle();     
  17.     }    
  18.  
MyView.java 全部代码如下:
view plaincopy to clipboardprint?
 
  
  
  
  
  1. package com.android.tutor;     
  2. import android.content.Context;     
  3. import android.content.res.TypedArray;     
  4. import android.graphics.Canvas;     
  5. import android.graphics.Color;     
  6. import android.graphics.Paint;     
  7. import android.graphics.Rect;     
  8. import android.graphics.Paint.Style;     
  9. import android.util.AttributeSet;     
  10. import android.view.View;     
  11. public class MyView extends View {     
  12.     private Paint mPaint;     
  13.     private Context mContext;     
  14.     private static final String mString = "Welcome to Mr Wei's blog";     
  15.          
  16.     public MyView(Context context) {     
  17.         super(context);     
  18.         mPaint = new Paint();     
  19.     }     
  20.     public MyView(Context context,AttributeSet attrs)     
  21.     {     
  22.         super(context,attrs);     
  23.         mPaint = new Paint();     
  24.              
  25.         TypedArray a = context.obtainStyledAttributes(attrs,     
  26.                 R.styleable.MyView);     
  27.              
  28.         int textColor = a.getColor(R.styleable.MyView_textColor,     
  29.                 0XFFFFFFFF);     
  30.         float textSize = a.getDimension(R.styleable.MyView_textSize, 36);     
  31.              
  32.         mPaint.setTextSize(textSize);     
  33.         mPaint.setColor(textColor);     
  34.              
  35.         a.recycle();     
  36.     }     
  37.     @Override    
  38.     protected void onDraw(Canvas canvas) {     
  39.         // TODO Auto-generated method stub     
  40.         super.onDraw(canvas);     
  41.         //设置填充     
  42.         mPaint.setStyle(Style.FILL);     
  43.              
  44.         //画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标     
  45.         canvas.drawRect(new Rect(1010100100), mPaint);     
  46.              
  47.         mPaint.setColor(Color.BLUE);     
  48.         //绘制文字     
  49.         canvas.drawText(mString, 10110, mPaint);     
  50.     }     
  51. }    
 
三、将我们自定义的MyView 加入布局main.xml 文件中,平且使用自定义属性,自定义属性必须加上:
      xmlns:test =" http://schemas.android.com/apk/res/com.android.tutor "蓝色 是自定义属性的前缀,红色 是我们包名.
main.xml 全部代码如下:
view plaincopy to clipboardprint?
<?xml    
version="1.0" encoding="utf-8"?>   
<LinearLayout    
xmlns:android=" http://schemas.android.com/apk/res/android"  
                 
xmlns:test=" http://schemas.android.com/apk/res/com.android.tutor"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >   
<TextView     
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"    
    android:text="@string/hello"  
    />   
<com.android.tutor.MyView   
    android:layout_width="fill_parent"    
    android:layout_height="fill_parent"    
    test:textSize="20px"  
    test:textColor="#fff"  
/>   
</LinearLayout>  
四、运行之效果如下图:
Android 中自定义属性(attr.xml,TypedArray)的使用_第1张图片
今天就到此结束,大家有什么疑问的,请留言,我会及时答复大家!谢谢~
******************************************************************************************************

Android中attr自定义标签详解

 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:wen=http://schemas.android.com/apk/res/com.iteye.googlers
      android:orientation="vertical" android:layout_width="fill_parent"
      android:layout_height="wrap_content">

第二行是自定义标签。

格式如上,其中“xmlns:wen”冒号后面是标签名,在下面使用时(只对当前文件可用)

<TextView   wen:属性名/>

“com.iteye.googlers”是你的工程包名。


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-styleable name = "名称">
                             <attr name = "textColor" format = "color" />
                  </declare-styleable>
      (2)属性使用:
                  <TextView
                                android:layout_width = "42dip"
                                android:layout_height = "42dip"
                                android:textColor = "#00FF00"
                                />

  3. boolean:布尔值。
      (1)属性定义:
                  <declare-styleable name = "名称">
                        <attr name = "focusable" format = "boolean" />
                  </declare-styleable>
      (2)属性使用:
                  <Button
                             android:layout_width = "42dip"
                             android:layout_height = "42dip"
                             android:focusable = "true"
                              />
 
4. dimension:尺寸值。
        (1)属性定义:
                    <declare-styleable name = "名称">
                             <attr name = "layout_width" format = "dimension" />
                  </declare-styleable>
      (2)属性使用:
                  <Button
                             android:layout_width = "42dip"
                             android:layout_height = "42dip"
                           />

  5. float:浮点值。
      (1)属性定义:
                  <declare-styleable name = "AlphaAnimation">
                             <attr name = "fromAlpha" format = "float" />
                             <attr name = "toAlpha" format = "float" />
                  </declare-styleable>
      (2)属性使用:
                  <alpha
                             android:fromAlpha = "1.0"
                             android:toAlpha = "0.7"
                             />
 
6. integer:整型值。
      (1)属性定义:
                  <declare-styleable name = "AnimatedRotateDrawable">
                             <attr name = "visible" />
                             <attr name = "frameDuration" format="integer" />
                             <attr name = "framesCount" format="integer" />
                             <attr name = "pivotX" />
                             <attr name = "pivotY" />
                             <attr name = "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-styleable name = "MapView">
                             <attr name = "apiKey" format = "string" />
                  </declare-styleable>
      (2)属性使用:
                  <com.google.android.maps.MapView
                              android:layout_width = "fill_parent"
                              android:layout_height = "fill_parent"
                              android:apiKey = "0jOkQ80oD1JL9C6HAja99uGX CRiS2CGjKO_bc_g"
                              />

8. fraction:百分数。
        (1)属性定义:
                  <declare-styleable name="RotateDrawable">
                             <attr name = "visible" />
                             <attr name = "fromDegrees" format = "float" />
                             <attr name = "toDegrees" format = "float" />
                             <attr name = "pivotX" format = "fraction" />
                             <attr name = "pivotY" format = "fraction" />
                             <attr name = "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-styleable name="名称">
                             <attr name="orientation">
                                       <enum name="horizontal" value="0" />
                                       <enum name="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-styleable name="名称">
                              <attr name="windowSoftInputMode">
                                          <flag name = "stateUnspecified" value = "0" />
                                          <flag name = "stateUnchanged" value = "1" />
                                          <flag name = "stateHidden" value = "2" />
                                          <flag name = "stateAlwaysHidden" value = "3" />
                                          <flag name = "stateVisible" value = "4" />
                                          <flag name = "stateAlwaysVisible" value = "5" />
                                          <flag name = "adjustUnspecified" value = "0x00" />
                                          <flag name = "adjustResize" value = "0x10" />
                                          <flag name = "adjustPan" value = "0x20" />
                                          <flag name = "adjustNothing" value = "0x30" />
                                </attr>             
                    </declare-styleable>

        (2)属性使用:
                  <activity
                             android:name = ".StyleAndThemeActivity"
                             android:label = "@string/app_name"
                             android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">
                             <intent-filter>
                                       <action android:name = "android.intent.action.MAIN" />
                                       <category android:name = "android.intent.category.LAUNCHER" />
                             </intent-filter>
                    </activity>
        注意:
        属性定义时可以指定多种类型值。
      (1)属性定义:
                  <declare-styleable name = "名称">
                             <attr name = "background" format = "reference|color" />
                  </declare-styleable>
      (2)属性使用:
                    <ImageView
                                android:layout_width = "42dip"
         

  
  
  
  

你可能感兴趣的:(Android 中自定义属性(attr.xml,TypedArray)的使用)