转载请注明出处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