一、创建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日志