这个文集中文章主要是自己在学习中记录的重要知识点,方便日后查阅。
什么是View?
View是所有控件的基类,ViewGroup也是View的子类。ViewGroup中包含多个View。
View的典型子类:Button、TextView等…
ViewGroup典型的子类:LinearLayout、RelativeLayout等…
View的位置参数
其中getLeft()、getRight()、getTop()、getBottom()是View中的方法
getX()、getY()、getRawX()、getRawY()是MotionEvent中的方法
TouhSlop
是系统所能识别出的被认为是滑动的最小距离,意思当手指滑动时,两次滑动之间的距离小于这个常量,系统就不认为是滑动操作。
VelocityTracker
速度追踪器,用于追踪手指在滑动过程中的速度。
GestureDetector
手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。
Scroller
弹性滑动对象、用于实现View的弹性滑动
View的滑动
1.使用scrollTo/scrollBy
2.使用动画ObjectAnimator
3.改变布局参数LayoutParams
弹性滑动
1.使用Scroller
2.通过动画ObjectAnimator/ValueAnimator
3.使用延时策略使用Handler或者View的postDelayed
View的事件分发机制
所谓点击事件的分发,就是对MotionEvent事件的分发过程,即当一个MotionEvent产生以后,系统需要把这个事件传递到具体的View,这个传递的过程就是分发的过程。
重要方法
dispatchTouchEvent(MotionEvent ev);进行时事件的分发
onInterceptTouchEvent(MotionEvent ev);用来判断是否拦截某个事件
onTouchEven(MotionEvent ev);处理点击事件
事件的调度顺序应该是
onTouchListener > onTouchEvent > onLongClickListener > onClickListener。
结论总结
ViewGroup默认不拦截任何事件,onInterceptTouchEvent方法默认返回false。
View没有onInterceptTouchEvent方法,有点击事件传递给它,就调用它的onTouchEvent方法。
View只要它的clickable或者longClickable有一个为true,TouchEvent就返回true。不受View的enable属性影响。
View的滑动冲突
常见滑动冲突
1.外部滑动方向和内部滑动方向不一致
2.外部滑动方向和内部滑动方向一致
3.上面两种情况的嵌套
滑动冲突的解决方式
1.外部拦截法:指的是点击事件先经过父容器的拦截处理,父容器需要此事件就拦截。外部拦截法需要重写父容器的onInterceptTouchEvent方法
2.内部拦截法:指的是父容器不拦截任何事件,所有事件都传递给子元素,子元素需要此事件就直接消耗掉,否则就由父容器处理。此方法需要重写子元素的dispatchTouchEvent方法还需要配合requestDisallowInterceptTouchEvent才能正常工作。
由于内部拦截法相对外部拦截法相对复杂,一般建议采用外部拦截法来解决常见的滑动冲突。