1.什么是View
View是Android中所有控件的基类,View是界面层的控件的一种抽象。
2.位置参数
在Android中,x轴和y轴的正方向分别为左上角的右和下;
view的位置由四个顶点决定:top , left , right , bottom;
Android3.0以后新增x , y translationX , translationY;
关系:
x = left + translationX
y = top + translationY
注意:在平移的过程中top , left表示原始左上角的位置信息
3.MotionEvent & TouchSlop
TouchSlop是系统所能识别出的被认为是滑动的最小距离和设备有关(默认是8)。
最小滑动距离:
ViewConfiguration.get(context).getScaledTouchSlop()
作用:过滤(滑动的临界值,当小于该值时则被认为没有滑动)
4.VelocityTracker & GestureDetector & Scroller
- VelocityTracker : 速度追踪,追踪手指在滑动过程中的速度,可以为负数
速度 = (终点位置 - 起点位置)/时间段 - GestureDetector : 手势检测,辅助检测用户的单击,滑动,长按,双击等行为。
建议:如果只是监听滑动,在onTouchEvent中实现;如果监听双击行为,是要GestureDetector - Scroller : 弹性滑动对象,用于实现View的弹性滑动。
5.View的滑动
方法:
- View本身提供的scrollTo() / scrollBy() : 移动的是View的内容,不能改变view在布局中的位置;向右(向下)滑动 mScrollX(mScrollY)为负;适合对View内容的滑动
- 使用动画:改变View的translationX , translationY的值;实现复杂的动画效果
- 改变view的LayoutParams:设置margin值,或者根据layout来改变空view的width;适合有交互的view
6.弹性滑动
- 使用Scroller
注意: mScroller.startScroll() 保存我们传递的参数,并没有执行滑动相关的操作
Scroller本身并不能实现View的滑动,需要配合View的computeScroll() - 使用动画
7.View的事件分发机制
点击事件的分发由三个方法来共同完成:
dispatchTouchEvent() : 分发事件
onInterceptTouchEvent() : 拦截事件
onTouchEvent() : 处理事件
注意:
同一事件序列:指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束(ACTION_DOWN开始,最终以ACTION_UP结束);通常同一事件序列只能被一个View拦截且消耗,并且一旦View决定拦截,那么这个事件序列都只能由他来处理。
如果一个View不消耗ACTION_DOWN事件,那么同一事件的其他的事件都不会再交给他处理。
默认: ViewGroup的onInterceptTouchEvent返回false; View的onTouchEvent返回true
顶级View对点击事件的分发过程:
8.滑动冲突
- 滑动冲突场景
- 处理规则
场景一的处理规则:当用户左右滑动时,让外部拦截;当用户上下滑动时,内部view拦截处理
场景二的处理规则:从业务上找到突破点 - 解决方式
外部拦截法
ACTION_DOWN事件必须返回false(如果返回true,那么接下来的ACTION_MOVE事件都会被父容器拦截);
ACTION_MOVE根据需求做处理;
ACTION_UP必须返回false(如果返回true,那么子元素的onClick事件就无法触发)
内部拦截法
需要调用父容器的requestDisallowInterceptTouchEvent()
该方法的作用是请求不允许拦截触摸事件