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

来源:互联网 发布:淘宝双十一真的便宜吗 编辑:程序博客网 时间:2024/05/21 09:28

在xml 文件里定义控件的属性,我们已经习惯了android:attrs="" ,那么我们能不能定义自己的属性能,比如:test:attrs="" 呢?答案是肯定的.

一、在res/values文件下定义一个attrs.xml文件.代码如下: 

<?xml version="1.0" encoding="utf-8"?> <resources>     <declare-styleable name="MyView">         <attr name="textColor" format="color" />         <attr name="textSize" format="dimension" />     </declare-styleable> </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() 方法,为了保持以后使用该属性一致性!
public MyView(Context context,AttributeSet attrs)   {    super(context,attrs);    mPaint = new Paint();        TypedArray a = context.obtainStyledAttributes(attrs,      R.styleable.MyView);        int textColor = a.getColor(R.styleable.MyView_textColor,      0XFFFFFFFF);    float textSize = a.getDimension(R.styleable.MyView_textSize, 36);        mPaint.setTextSize(textSize);    mPaint.setColor(textColor);        a.recycle();   }   
MyView.java 全部代码如下:

package com.android.tutor;     import android.content.Context;     import android.content.res.TypedArray;     import android.graphics.Canvas;     import android.graphics.Color;     import android.graphics.Paint;     import android.graphics.Rect;     import android.graphics.Paint.Style;     import android.util.AttributeSet;     import android.view.View;     public class MyView extends View {         private Paint mPaint;         private Context mContext;         private static final String mString = "Welcome to Mr Wei's blog";                  public MyView(Context context) {             super(context);             mPaint = new Paint();         }         public MyView(Context context,AttributeSet attrs)         {             super(context,attrs);             mPaint = new Paint();                          TypedArray a = context.obtainStyledAttributes(attrs,                     R.styleable.MyView);                          int textColor = a.getColor(R.styleable.MyView_textColor,                     0XFFFFFFFF);             float textSize = a.getDimension(R.styleable.MyView_textSize, 36);                          mPaint.setTextSize(textSize);             mPaint.setColor(textColor);                          a.recycle();         }         @Override        protected void onDraw(Canvas canvas) {             // TODO Auto-generated method stub             super.onDraw(canvas);             //设置填充             mPaint.setStyle(Style.FILL);                          //画一个矩形,前俩个是矩形左上角坐标,后面俩个是右下角坐标             canvas.drawRect(new Rect(10, 10, 100, 100), mPaint);                          mPaint.setColor(Color.BLUE);             //绘制文字             canvas.drawText(mString, 10, 110, mPaint);         }     }    

三、将我们自定义的MyView 加入布局main.xml 文件中,平且使用自定义属性,自定义属性必须加上:
      xmlns:test ="http://schemas.android.com/apk/res/com.android.tutor "蓝色 是自定义属性的前缀,红色 是我们包名.
main.xml 全部代码如下:
<?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>  

文章转自:http://weizhulin.blog.51cto.com/1556324/311453



原创粉丝点击