android开发艺术探索 第三章 View的事件体系

本章主要介绍:

view基础,MotionEvent,TouchSlop,VelocityTracker,GestureDetetor,Scroller,view滑动,弹性滑动,事件分发机制

1.view的基础概念

view:android中所有控件的基类。

viewGroup:控件组。

2.view的位置几种表示法:

①.view.getLeft(),view.getRight(),view.getTop(),view.getBottom()        相对父布局的位置参数

②.view.getX(),view.getY()                                                                 相对屏幕左上角坐标

③.view.getTranslationX(),view.getTranslationY()                                相对父布局左上角的坐标

④.event.getX(),event.getY()                                                                相对父布局左上角的坐标(view中motionEvent参数的位置)

⑤.event.getRawX,event.getRawY()                                                    相对屏幕左上角的坐标(view中motionEvent参数的位置)

3.MotionEvent和TouchSlop

MotionEvent常用的事件类型:

ACTION_DOWN:手指刚触摸屏幕

ACTION_MOVE:手指在屏幕上移动

ACTION_UP:手指离开屏幕的一瞬间

ACTION_CANCEL:被取消的事件(比如:action_down分发给了子控件,action_move和action_up没有分发给子控件,此时子控件的ACTION_CANCEL会被调用)

TouchSlop:最小滑动距离(为了提升用户体验如果滑动距离小于这个值可以默认没滑动)

4.VelocityTracker、GestureDetector、OnDoubleTapListener和Scroller

VelocityTracker:速度追踪。

GestureDetector:监听单击双击滑动长按等动作。

OnDoubleTapListener:监听双击动作。

Scroller:弹性滑动对象,用于实现弹性滑动的。

5.view的滑动

①.ScrollTo、ScrollBy:

     (1)都是对view的内容进行滑动;

     (2)ScrollBy本质调用了ScrollTo;

     (3)注意滑动时向左(向上)为正值,向右(向下)为负值

②.动画:

       (1)view动画(并没有真正改变位置)

       (2)属性动画(真正改变位置)

③.布局位置(layout,offsetLeftAndRight,offsetTopAndBottom)

④.布局参数(LayoutParams)

6.view的弹性滑动

①Scroller+computeScroll+scrollTo

②动画

③延时策略(Handler,view.postDelayed)

7.事件分发机制(重点):事件分发过程dispatchTouchEvent,onIntercepteTouchEvent,onTouchEvent;

①一个事件序列一旦被某个view拦截,那么后续的事件都交给他处理。

②如果view的某个事件不消耗ACTION_DOWN,那么同一个事件的其他事件都不会交给他处理,会交给他的父布局处理。

③如果view的某个事件不消耗除ACTION_DOWN之外的事件,那么这个事件会消失,最后消失的点击事件会交给Activity处理。

④viewGroup默认不拦截事件。

⑤view没有OnInterceptTouchEvent方法,一旦点击事件传给他,就会调用他的OnTouchEvent方法。

⑥view的Ontouchevent默认消耗事件。

⑦onclick发生的前提是当前事件是可点击的。

⑧子view可以通过requestDisallowInterceptTouchEvent方法干预父元素的事件分发过程,但ACTION_DOWN除外。

⑨源码分析可得事件优先级OnTouch---->OnTouchEvent---->OnClick。

8.事件滑动冲突

①外部拦截法(通过父布局的OnIntercepteTouchEvent方法)

②内部拦截法(通过子view的OnTouchEvent方法和requestDisallowInterceptTouchEvent及父布局的OnIntercepteTouchEvent)

猜你喜欢

转载自blog.csdn.net/gongjdde/article/details/89225790
今日推荐