自定义控件的步骤:
一、自定义属性的声明与获取:
分析需要的自定义属性;
在res/values/attrs.xml定义声明;
<declare-styleable name = "*****">
<attr name = "icon"></attr>
</declare-styleable >
在layout xml文件中进行使用;
在view的构造方法中进行获取:
通过TypeArray a = context.obtainStyledAttributes(attrs,R.styleable.*****)获取,a.getIndexCount()、a.getIndex(i)遍历获取,最后a.recycle()
二、测量onMeasure ,
测量模式:EXACTLY 明确的值, AT_MOST控件最大至多不能超过某个值, UNSPECIFIED 没有限制 eg:scrollview
MeasureSpec类,判断模式
setMeasuredDimension传入值
requestLayout()
三、布局onLayout(ViewGroup),
如果是ViewGroup需要通过onLayout设置子view的位置
决定子view的位置;
尽可能将onMeasure中一些操作移动到此方法中。
requestLayout()
四、绘制onDraw,
绘制内容区域;
invalidate(),postInvalidate();
Canvas.draw****;
translate,rotate,scale,skew;
save(),restore();
五、onTouchEvent,
用户交互,多指触控:ACTION_DOWN ACTION_MOVE ACTION_UP;
ACTION_POINTER_DOWN ACTION_POINTER_UP
parent.requestDisallow-InterceptTouchEvent(true);
VelocityTracker
六、onInterceptTouchEvent(ViewGroup)
ACTION_DOWN ACTION_MOVE ACTION_UP
ACTION_POINTER_DOWN ACTION_POINTER_UP
决定是否拦截该手势
总结
一般自定义View都需要进行这几个步骤,首先可以自定义一些自己的属性,在res/values/attrs.xml里面定义,然后在layout中使用,在View中通过context.obtainStyledAttributes(attrs,R.styleable.自定义属性的名字)进行获取。
然后在测量onMeasure,一般通过他的三个模式(EXACTLY,AT_MODE,,UNSPECIFIED)进行测量,调用setMeasuredDimension进行传入设置的值。
接着如果是ViewGroup 的话我们还需要设置下子View的位置,一般是通过requestLayout去触发onLayout的方法的。
最后在onDraw里面通过Canvas的一些方法进行绘制。
如果需要进行触摸事件的话,一般需要有实现onTouchEvent事件,注意,如果需要多点触摸,需要实现ACTION_POINTER_DOWN和ACTION_POINTER_UP进行处理。