書接上回
在xml裡建立屬性,然後java代碼裡用typedArray獲得這些屬性,得到屬性後,利用屬性做一些事.例:得到xml裡的color,賦給paint.
1.在res/values/下建立attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CustomView2">
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
</declare-styleable>
</resources>
<!-- name="CustomView1"控件名稱 得到TypedArray時用 -->
<!-- name="textColor" 對應test:textColor -->
<!-- format="color" 對應構造方法裡a.getColor(R.styleable.CustomView2_textColor, 0xFFFFFFFF); -->
format詳解可參照 http://blog.csdn.net/ethan_xue/article/details/7315064
2.主要看構造函數
public class CustomView2 extends View {
private Paint mPaint2;
private String mText = "drawText";
public CustomView2(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint2 = new Paint();
// TypedArray是存放資源的array,1.通過上下文得到這個數組,attrs是構造函數傳進來的,對應attrs.xml
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView2);
// 獲得xml裡定義的屬性,格式為 名稱_屬性名 後面是預設值
int textColor = a.getColor(R.styleable.CustomView2_textColor, 0xFFFFFFFF);
float textSize = a.getDimension(R.styleable.CustomView2_textSize, 35);
mPaint2.setColor(textColor);
mPaint2.setTextSize(textSize);
// 為了保持以後使用該屬性一緻性,傳回一個綁定資源結束的信号給資源
a.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint2.setStyle(Style.FILL);
canvas.drawText(mText, 10, 60, mPaint2);
}
}
3.布局
<?xml version="1.0" encoding="utf-8"?>
<!-- xmlns:test="http://schemas.android.com/apk/res/ethan.customview1" 包名 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:test="http://schemas.android.com/apk/res/ethan.customview1"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ethan.customview1.CustomView2
android:layout_width="wrap_content"
android:layout_height="wrap_content"
test:textColor="#f00"
test:textSize="20sp"
/>
</LinearLayout>
4.效果圖
下載下傳位址 http://download.csdn.net/detail/ethan_xue/4108832