Android自定义控件的属性

    当要编写自己的widget或者其他view组件时,能够定义自己的属性标签是很重要的,这让我们能够彻底定制view的外观。

     知识点:

     1.自定义属性标签及其格式属性。

     2.如何创建自己的View。

     3.如何使用自己的View。


一、自定义属性标签及其格式属性

     在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" />
		<attr
			name="background" 
			format="reference"
		/>
	</declare-styleable>
</resources>
这里定义了一个样式属性资源。名字就是MyView,然后有三个属性,文字的颜色,文字的大小,View的背景图片。可以看到attr除了name属性以外,还有一个format属性,它规定了这个属性的数据类型。这个format属性有很多,除了上面的color,dimension,reference以外,还有

         reference:参考某一资源ID。

         color:颜色值。

         boolean:布尔值。

         dimension:尺寸值。

         float:浮点值。

         integer:整型值。

         string:字符串。

         fraction:百分数。

         enum:枚举值。

         flag:位或运算。


二、如何创建自己的View

         继承View或者它的子类,然后重写构造函数和onDraw函数。看看代码:

        

package com.wenix;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class MyView extends View {
	private static final String TAG = "MyView";
	private Paint mPaint;
	Drawable background;
	
	public MyView(Context context) {
		// TODO Auto-generated constructor stub
		super(context);
	}
	
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mPaint = new Paint();
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);//得到属性数组
		
		int textColor = a.getColor(R.styleable.MyView_textColor, Color.BLUE);//得到属性值,可以指定默认值,防止空值,注意引用名。
		float textSize = a.getDimension(R.styleable.MyView_textSize, 22);//注意get方法,跟format是一致的。
		background = a.getDrawable(R.styleable.MyView_background);
		
		mPaint.setColor(textColor);
		mPaint.setTextSize(textSize);
		
		a.recycle();//一定要recycle以下来保证属性值一致。
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		mPaint.setStyle(Style.FILL);

		Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.myview_background);
		canvas.drawBitmap(bitmap, 0, 0, mPaint);
//		Matrix matrix = new Matrix();
//		matrix.postScale(0, 0, 480, 800);
//		canvas.drawBitmap(bitmap, matrix, mPaint);
		
		
		mPaint.setColor(Color.RED);
		canvas.drawText("hello,world!", 20, 55, mPaint);
	}

}

三、如何使用自定义View

      有了自定义属性数组,又有了自定义View,下面说说怎么使用自定义View吧。看main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	 xmlns:wenix="http://schemas.android.com/apk/res/com.wenix"  //最重要的就是这个命名空间,xmlns后写上你自己的标签,下面就可以引用属性
    android:orientation="vertical"                                   //了,res/后面跟上控件所在包的包名。
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/background"
    >
	<com.wenix.MyView
		android:id="@+id/myview"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		wenix:textColor="#ffffffff"       //使用上面定义的标签来引用属性。
		wenix:textSize="22dp"/>
</LinearLayout>

然后去要用的地方用吧,看看MainActivity.java代码:


      

package com.wenix;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class MainActivity extends Activity {
	private static final String TAG = "MainActivity";
	MyView myView;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        myView = (MyView)findViewById(R.id.myview);
        myView.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "onClick", Toast.LENGTH_LONG).show();
			}
		});
        
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        Log.i(TAG,"screen width="+dm.widthPixels+",screen height="+dm.heightPixels);//顺便写了段检测屏幕大小的代码。
    }
}



     最后上效果图:




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值