先总结下自定义 View 的步骤:
- 自定义 View 的属性
- 在 View 的构造方法中获得我们自定义的属性
- [重写 onMeasure]
- 重写 onDraw
我把 3 用[]标出了,所以说 3 不一定是必须的,当然了大部分情况下还是需要重写的。
- 自定义 View 的属性,首先在 res/values/  下建立一个attrs.xml , 在里面定义我们的属性和声明我们的整个样式。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | <?xml version="1.0" encoding="utf-8"?><resources>
 
 <attr name="titleText" format="string" />
 <attr name="titleTextColor" format="color" />
 <attr name="titleTextSize" format="dimension" />
 
 <declare-styleable name="CustomTitleView">
 <attr name="titleText" />
 <attr name="titleTextColor" />
 <attr name="titleTextSize" />
 </declare-styleable>
 
 </resources>
 
 | 
format是值该属性的取值类型:
string, color, demension, integer, enum, reference, float,boolean, fraction, flag;不清楚的可以 google
 自定义View之基础概念之用到的六个工具
- 
Configuration 
- 
ViewConfiguration
 提供了一些自定义控件用到的标准常量, 比如UI超时, 尺寸大小, 滑动距离, 敏感度等等
 ![]() 
 
- 
GestureDetector
 简化Touch操作
 
- 
VelocityTracker
 用于跟踪触摸屏事件(比如: Flingling以及其他手势事件)的速率
 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | mVelocityTracker = VelocityTracker.obtain();mVelocityTracker.addMovement(MotionEvent event);
 
 
 mVelocityTracker.computeCurrentVeleocity(1000)
 
 
 mVelocityTracker.getXVelocity()
 
 
 mVelocityTracker.recycle()
 
 | 
- Scroller
 scrollBy() 内部还是调用了scrollTo()
 scrollTo() 和 scrollBy()
mTextView.scrollTo(0, 25)
- ViewDragHelper
 简化View的拖拽操作
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | ViewDragHelper mViewDragHelper = ViewDragHelper.create(context, 1.0f, new ViewDragHelper.Callback(){clampViewPositionHorizontal(View child, int left, int dx)
 clampViewPositionVertical(View child, int left, int dx)
 onViewDragStateChanged(int state){
 ViewDragHelper.STATE_DRAGGING:
 ViewDragHelper.STATE_IDLE:
 ViewDragHelper.STATE_SETTLING:
 }
 }
 
 然后代理两个方法
 
 ```java
 public boolean onINterrceptTouchEvent(MotionEvent ev) {
 return mViewDragHelper.shouldInterceptTouchEvent(ev);
 }
 
 public boolean onTouchEvent(MotionEvent ev) {
 mViewDragHelper.processTouchEvent(ev);
 return true;
 }
 
 | 
| 12
 3
 4
 
 | int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);
 
 int measureSpec = MeasureSpec.makeMeasureSpec(size, mode);
 
 | 
![]()