一、创建res\values\attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CrossView">
<attr name="android:color" />
<attr name="rotation" format="string" />
<!-- 自定义枚举 --> <attr name="enum_attr"> <enum name="value1" value="1" /> <enum name="value2" value="2" /> </attr> <!-- 自定义标识 --> <attr name="flag_attr"> <flag name="flag1" value="0x01" /> <flag name="flag2" value="0x02" /> </attr>
</declare-styleable> </resources>
declare-styleable中的name可以随便命名,通常用类名。
attr中的name为属性名,format为属性类型。如果name用android内置的属性名则不需要设置format。
提示:关于可能的属性格式类型没有真正的文档。最好的文档是android.R.styleable.attr.xml文件和android.content.res.TypedArray类的Android源代码。当前格式包括引用(reference)、字符串(string)、颜色(color)、尺寸(dimension)、布尔值(boolean)、整数(integer)、浮点数(float)、百分数(fraction)、枚举(enum)和标识(flag)。
二、创建自定义视图CrossView.java
package com.test.androidtest;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class CrossView extends View {
private Paint mPaint;
private float[] mPoints = {0.5f, 0f, 0.5f, 1f,
0f, 0.5f, 1f, 0.5f};
public CrossView(Context context) {
super(context);
}
public CrossView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取自定义属性
TypedArray arr = getContext().obtainStyledAttributes(attrs, R.styleable.CrossView);
int color = arr.getColor(R.styleable.CrossView_android_color, Color.WHITE);
float rotation = arr.getFloat(R.styleable.CrossView_rotation, 0f);
int enum_attr = arr.getInt(R.styleable.CrossView_enum_attr, 0);
int flag_attr = arr.getInt(R.styleable.CrossView_flag_attr, 0);
Log.i("test", "color="+color+", rotation="+rotation + ", enum_attr="+enum_attr+", flag_attr="+flag_attr);
mPaint = new Paint();
mPaint.setAntiAlias(true); //设置抗锯齿
mPaint.setColor(0xFFFFFFFF);//设置画笔颜色
}
public CrossView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* 所有的在画布上绘图的调用都应当受对应的save()和restore()的约束
*/
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
//自定义代码
int scale = getWidth();
canvas.scale(scale, scale);
canvas.drawLines(mPoints, mPaint);
//end
canvas.restore();
}
}
三、创建活动
res\layout\activity_cross.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.test.androidtest"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.test.androidtest.CrossView android:id="@+id/crossView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
custom:rotation="45"
custom:enum_attr="value1"
custom:flag_attr="flag1|flag2"
android:color="#FFFF00"/>
</LinearLayout>
注意:
自定义命名空间custorm可以任意命名。
xmlns:custom="http://schemas.android.com/apk/res/com.test.androidtest"中的com.test.androidtest为AndroidManifest.xml中的package。前面的http://schemas.android.com/apk/res/为固定值。
MainActivity.java
package com.test.androidtest;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cross);
}
}
运行测试
LogCat日志