android 自定义控件总结(不自带xml文件)

本文总结了创建Android自定义控件的步骤,包括在attrs.xml中定义属性,构造函数中解析属性,布局初始化,提供公共方法,事件监听处理,以及如何实现事件分发。强调了在onTouchEvent中的事件顺序和在onInterceptTouchEvent中拦截事件的方法。同时提醒开发者给控件添加注释和文档以方便使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处http://blog.youkuaiyun.com/u014071694/article/details/51909591


之前自己制作了一下自定义控件,并查阅了一些相关知识,现在粗粗总结一下,其中遇到的一些知识点以后再分开仔细一点总结一下。

先总体写一下如何制作自定义控件,为了解耦所有布局都在代码中创建,使用的时候就不需要带入xml,只需要在用到的地方用xml配置即可,方便好用。


1.      在atter.xml里写属性,将一些可能会需要设置的值放在xml里,如:

 

  <declare-styleable name="ChangeColorButton">
        <attr name="colorBtnLeftText" format="reference|string"></attr>
        <attr name="colorBtnRightText" format="reference|string"></attr>
        <attr name="colorBtnTopText" format="reference|string"></attr>

然后在自定义控件的构造函数里从xml里解析获得这些属性,如:

TypedArray params = context.obtainStyledAttributes(attrs, R.styleable.ChangeColorButton);
		// 取得
		_imageID[0] = params.getResourceId(R.styleable.ChangeColorButton_colorBtnNormalImg, 0);
		_imageID[1] = params.getResourceId(R.styleable.ChangeColorButton_colorBtnSelectedImg, 0);
		_text[0] = params.getString(R.styleable.ChangeColorButton_colorBtnLeftText);

记得在解析完之后回收TypeArray:

params.recycle();

2.      可以在构造函数里初始化布局,也可以在onFinishInflate()中初始化布局,onFinishInflate():当View中所有的子控件均被映射成xml后触发。

3.      初始化布局,新建控件和布局然后将XML里解析出来的相关值初始化给他们,以及初始化一些属性

4.      写一些可以被外部调用的public方法,让使用者可以动态设置一些可能需要动态设置的属性,或者获取一些参数。

/**
	 * 
	 * @Title: setBtnNormalImg
	 * @Description: 设置图片
	 * @param @param
	 *            value 设定文件
	 * @return void 返回类型
	 */
	public void setBtnNormalImg(int value) {
		_imageID[0] = value;
	}

5.      写自定义控件的事件监听。

在同一个控件中,首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件,然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。此时,onTouch和onLongClick都要return false,事件才能继续传递,如果return true则此次事件被消费,不继续传递,就会终止。

参考链接:http://www.2cto.com/kf/201207/142734.html里面详细说明了ontouch中down 和up 动作return true和false的结果

在父子控件中:

触摸事件的分发会经过这么几个顺序,dispatchTouchEvent--> onInterceptTouchEvent --> onTouchEvent,事件拦截就在onInterceptTouchEvent方法中进行

首先在父控件中触发事件,然后传递给子控件进行处理,如果想要不继续传递则可以重写onInterceptTouchEvent并返回true。此处需要注意的是如果子控件监听了onclick方法,则此次事件被消费,这是因为如果这个控件是可以点击的,那么onTouchEvent方法就返回true,这次事件就被该控件消费了(像Button,CheckBox这样的控件默认都是可以点击的)。

参考链接:http://blog.youkuaiyun.com/jiangwei0910410003/article/details/17504315里面详细实验了各种true和false,并展示结果。

6.      给自定义控件的事件监听提供接口,供外部调用:

// onclick接口
	private OnColorBtnClickListener mColorBtnClickLs = null;

	public interface OnColorBtnClickListener {
		public void colorBtnOnClick(View v);
	}
//转载请注明出处http://blog.youkuaiyun.com/u014071694/article/details/51909591
	/**
	 * 
	 * @Title: setOnColorBtnClickListener
	 * @Description: 设置click监听
	 * @param @param:ls
	 * @return void 返回类型
	 */
	public void setOnColorBtnClickListener(OnColorBtnClickListener ls) {
		mColorBtnClickLs = ls;
	}

@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if (mColorBtnClickLs != null) {
			mColorBtnClickLs.colorBtnOnClick(v);
		}
	}

注意空值判断

7.      记得给控件写一些注释说明和文档,方便使用者可以不用看代码就可以快速调用,然后就可以愉快的使用这个自定义控件啦


转载请注明出处http://blog.youkuaiyun.com/u014071694/article/details/51909591

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值