《安卓开发艺术探索》第三章 View的事件体系—学习笔记

这个文集中文章主要是自己在学习中记录的重要知识点,方便日后查阅。

什么是View?

View是所有控件的基类,ViewGroup也是View的子类。ViewGroup中包含多个View。
View的典型子类:Button、TextView等…
ViewGroup典型的子类:LinearLayout、RelativeLayout等…

View的位置参数

位置参数.PNG
其中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);处理点击事件

扫描二维码关注公众号,回复: 11315391 查看本文章
事件的调度顺序应该是

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才能正常工作。

由于内部拦截法相对外部拦截法相对复杂,一般建议采用外部拦截法来解决常见的滑动冲突。

猜你喜欢

转载自www.cnblogs.com/cloud9527/p/13161488.html