android 重写控件添加自定义属性

转载请注明:

http://blog.csdn.net/zenmela2011/article/details/42460223

安卓系统本身已经自带了许多控件,但是如果我们需要满足自己特殊功能的控件,我们可以依照自己的需求自己写,可谓“量身定做”。比如你可以继承ImageVIew,然后在其中添加自己需要的属性,这样这个控件就既有了ImageView所有的功能,又有了我们自己添加的功能。

举例如下:

我们继承View,写一个可以添加图片,而且可以旋转指定角度的控件。

第一步,首先新建一个Class,继承View:

package com.fang.androidtest;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

/**
 * 自定义View控件
 * 
 * @author fangfang
 * 
 */
public class MyView extends View {
	// 命名空间,必须以“http://”开头
	private final String nameSpace = "http://com.fang.android";
	// 旋转角度的属性
	private float mRotateDegree;
	// 图片ID的属性
	private int mDrawableId;
	// 图片属性
	private Drawable mDrawable;
	// 原始图片所需宽、高
	private int mDrawableWidth;
	private int mDrawableHeight;

	public MyView(Context context) {
		super(context);
	}

	public MyView(Context context, AttributeSet attrs, int defStyle) {
		this(context, attrs);
	}

	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// 从xml文件中获取imageShow属性,若没有该属性,则默认为R.drawable.ic_launcher
		mDrawableId = attrs.getAttributeResourceValue(nameSpace, "imageShow",
				R.drawable.ic_launcher);
		// 根据图片Id,获得图片
		mDrawable = context.getResources().getDrawable(mDrawableId);
		// 从xml文件中获取rotateDegree属性,若没有该属性,则默认为0.0f(不旋转)
		mRotateDegree = attrs.getAttributeFloatValue(nameSpace, "rotateDegree",
				0.0f);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		// 设定View显示区域
		mDrawableHeight = mDrawable.getMinimumHeight();
		mDrawableWidth = mDrawable.getMinimumWidth();
		setMeasuredDimension(mDrawableWidth, mDrawableHeight);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		// 旋转画布
		canvas.rotate(mRotateDegree, mDrawableWidth / 2, mDrawableHeight / 2);

		// 执行draw
		mDrawable.setBounds(0, 0, mDrawableWidth, mDrawableHeight);
		mDrawable.draw(canvas);
	}
}
在这个类中,我们首先继承了View,并重写了该类的构造方法。因此,这个类就具有了View所有的属性。之后,我们可以自定义自己需要的属性了,比如mRotateDegree和mDrawableId,分别表示旋转的角度和显示的图片ID。你会发现,之外我们还定义了命名空间nameSpace,命名空间必须以“http://”开头,其后是自己随意定义的字符串即可。我们在添加自己的属性的时候需要用到命名空间。
在构造方法中,我们分别为两个属性在命名空间中起了个名字“imageShow”和“rotateDegree”,这两个名字在使用我们这个控件的时候会出现在xml布局文件中,就和“layout_width”“gravity”等属性的使用方法一样。

接下来是在xml布局文件中使用该控件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fang="http://com.fang.android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.fang.androidtest.MyView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerInParent="true"
        fang:imageShow="@drawable/ic_launcher"
        fang:rotateDegree="45.0" />

</RelativeLayout>

在布局文件中,我们在xml的头部声明了xmlns:fang="http://com.fang.android",可以发现,这个就是在我们控件中的命名空间,没错,这里要和命名空间的字符串一致。这里的“fang”就和android系统中的android一样,在“fang”后面我们就可以使用我们添加的那两个属性imageShow和rotateDegree了。


至此,添加属性就完成了。截图如下:


完整代码下载:http://download.csdn.net/detail/zenmela2011/8332651




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值