View的事件体系
文章目录
1)什么是View
2)View的位置参数
3)View的滑动
4)View事件分发机制
5)View滑动冲突
View基础
- 什么是View
- View是所有控件的基类,包括ViewGroup
- ViewGroup代表控件的集合,其中包括多个View控件,将整个界面的控件形成了一个树形结构,上层控件负责测量与绘制下层的控件,并传递交互事件
- View的位置参数
-
- 以屏幕左上角为坐标原点,向右为x轴增大方向,向下为y轴增大方向
- View的四个属性,top、left、right、bottom
- width=right-left,height=bottom-top
- 可以通过View的
get方法
获取上述属性 - Android 3.0后,增加参数 x、y、translationX、traslationY
- x与y是View左上角的坐标,translationX和translationY是View左上角相对于父容器的偏移量
MotionEvent
- 手指触摸屏幕锁产生的一系列事件
- ACTION_DOWN:手指刚接触屏幕
- ACTION_MOVE:手指在屏幕上滑动
- ACTION_UP:手指在屏幕上松开的一瞬间
TouchSlop
- 滑动的最小距离
- 常量,和设备有关,通过ViewConfiguration.get(getContext()).getScaledTouchSlop().
VelocityTracker
:速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。GestureDetector
:手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。
View的滑动
- 1.通过View本身提供的
scrollTo/scrollBy
方法- scrollBy是基于当前位置的相对滑动,而scrollTo是绝对滑动
- 2.通过动画给View施加平移效果:主要通过改变View的translationX和translationY参数来实现。View动画的View移动只是位置移动,并不能真正的改变view的位置,而属性动画可以。
- 3.通过改变View的LayoutParams使得View重新布局
- 实现View弹性滑动
- 1.使用Scroller
- Scroller本身并不能实现View的滑动,需要配合View的computeScroll方法才能实现弹性滑动的效果。
- 2.通过动画
- 动画本身就是一种渐近的过程,因此通过它来实现的滑动天然具有弹性效果
- 3.使用延时策略
- 通过发送一系列延时消息从而达到一种渐进式的效果,可以使用Handlere或View的postDelayed方法,也可以使用线程的sleep方法。
- 1.使用Scroller
- View事件分发机制
- MotionEvent事件分发的过程
- 点击事件的传递顺序:
Activity(Window)->ViewGroup->View
- 三个主要方法:
dispatchTouchEvent:
进行事件的分发(传递)onInterceptTouchEvent
:对事件进行拦截onTouchEvent
:进行事件处理
- View滑动冲突
- 在一个界面里存在内外两层可同时滑动的情况时,会出现滑动冲突现象
- 可以根据滑动的距离或者滑动的角度去判断
- 外部拦截法
- 指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截,需要重写父容器的
onInterceptTouchEvent
方法,在内部做出相应的拦截。
- 指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,否则就不拦截,需要重写父容器的
- 内部拦截法:
- 指父容器不拦截任何事件,而将所有的事件都传递给子容器,如果子容器需要此事件就直接消耗,否则就交由父容器进行处理。
- 使用
requestDisallowInterceptTouchEvent
方法。
参考
《Android开发艺术与探索》
要点提炼|开发艺术之View
View滑动与实现滑动的几种方法