自定义属性

作者:追风剑情 发布于:2016-5-10 13:39 分类:Android

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

111111.png


2222.png

标签: Android

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号