一、为什么要自定义控件:
1.特定的显示分格
2.处理特有的用户交互
3.优化我们的布局
4.封装等
二、如何自定义View
1.自定义属性的声明与获取
2.测量onMeasure
3.布局onLayout(ViewGroup)
4.绘制onDraw
5.onTouchEvent
6.onInterceptTonchEvent(ViewGroup)
自定义的声明与获取
1.分析需要的自定义属性
2.在res/values/attrs.xml定义声明
3.在layout xml文件中进行使用
4.在View的构造方法中进行获取
测量onMeasure
1.测量模式EXACTLY->match_parent, AT_MOST->wrap_content, UNSPECIFIED不受限制
2.MeasureSpec
3.setMeasureDimension
4.requestLayout()
布局onLayout(ViewGroup)
1.决定子View的位置
2.尽可能将onMeasure中操作移动到此方法中,比如耗时,初始化的工作,因为onLayout只执行一次
3.requestLayout(),触发onLayout方法
绘制onDraw
1.绘制内容区域
2.invalidate()可在U线程调用, postInvalidate()在子线程中调用,重绘
3.Canvas.drawXXX
4.translate、rotate、scale、skew
5.save(), restore()
onTouchEven
1. ACTION_DOWN
ACTION_MOVE
ACTION_UP
2. ACTION_POINTER_DOWN(多点触控)
ACTION_POINTER_UP(多点触控)
3. parent.requestDisallowInterceptTonchEvent(true)
4.VelocityTracker 检测滑动速度
onInterceptTonchEvent(ViewGroup)
1. ACTION_DOWN
ACTION_MOVE
ACTION_UP
2. ACTION_POINTER_DOWN(多点触控)
ACTION_POINTER_UP(多点触控
3. 决定是否拦截该手势