Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用(转)
一、?在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??MyView控件全部代码如下:?
????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"??,test是自定义属性的前缀,???????????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> ?