一般我们都是使用android:xxx=""...这样的android的属性。但有时我们需要使用自定义的属性,尤其是自定义view的时候尤其需要。
一般需要以下几个步骤:
1.在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>
2.重写我们的自定义View的构造方法。是使用 R.styleable.MyView获得我们的自定义属性。
TypedArray 通常最后调用 .recycle() 方法,为了保持以后使用该属性一致性!
package com.example.viewdemo;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View{
private Paint mPaint;
private Context mContext;
private static final String mString = "oh,God!";
public MyView(Context context) {
super(context);
}
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, 0xffffff);//注意加默认值
float textSize = a.getDimension(R.styleable.MyView_textSize, 36);
mPaint.setTextSize(textSize);
mPaint.setColor(textColor);
a.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
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);
}
}
3.将我们的自定义属性用在XML布局文件中。注意前缀
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:test="http://schemas.android.com/apk/res/com.example.viewdemo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<com.example.viewdemo.MyView
android:layout_width="match_parent"
android:layout_height="wrap_content"
test:textSize="40px"
test:textColor="#fff"
/>
</LinearLayout>
运行效果: