这是一篇老文章,移到个人新博客中,没看过的,能够看看。android
在移动开发过程中,咱们常常会遇到手势处理和事件触摸的状况,若是不了解整个事件的处理机制,对于开发的同窗和码农是很是痛苦的,可是事件触摸的处理确实是一个很是复杂的过程,细讲起来,估计我都能讲迷糊,这里呢,我只作一些简单的和经常使用事件的讲解,但愿可以帮助你们。程序员
事件的派发简单来说就是Activity将事件派发给容器和控件,容器或控件将事件进一步派发给其子容器和子控件,直到事件最终派发到事件发生的焦点控件上。微信
我想对于这些经常使用的事件触摸方法你们都应该有必定的了解,或者熟悉,那就是onTouchEvent()和dispatchTouchEvent(),OnInterceptTouchEvent(),看到方法后,相信你很快就会说,对我用过,可是具体的意思没有搞清楚,看别人这么说的,别人这么用的,我就跟着这么用的,用以前,对于这些方法咱们必定要搞清其做用,这样才能在作起来有的放矢。如今咱们就来介绍一下这三种方法的大概用法和做用。
<!--more-->spa
做用:处理本次触摸事件。code
解释:若是某个控件或容器消费了touch事件,则与该touch事件相关的后续touch事件者会派发给该控件或容器进行处理。事件
返回值:该方法的返回值机理与键盘响应事件的相同,一样是当已经完整地处理了该事件且不但愿其余回调方法再次处理时返回true,不然返回false。开发
通常状况下如下三种状况的事件所有由onTouchEvent方法处理,只是三种状况中的动做值不一样。get
屏幕被按下:当屏幕被按下时,会自动调用该方法来处理事件,此时MotionEvent.getAction()的值为MotionEvent.ACTION_DOWN,若是在应用程序中须要处理屏幕被按下的事件,只需从新该回调方法,而后在方法中进行动做的判断便可。博客
屏幕被抬起:当触控笔离开屏幕时触发的事件,该事件一样须要onTouchEvent方法来捕捉,而后在方法中进行动做判断。当MotionEvent.getAction()的值为MotionEvent.ACTION_UP时,表示是屏幕被抬起的事件。it
在屏幕中拖动:该方法还负责处理触控笔在屏幕上滑动的事件,一样是调用MotionEvent.getAction()方法来判断动做值是否为MotionEvent.ACTION_MOVE再进行处理。
做用:是否拦截触摸事件,true表示拦截,faIse表示不拦截。
解释:onInterceptTouchEvent这个事件是从父控件开始往子控件传的,直到有拦截或者到没有这个事件的view,而后就往回从子到父控件,(相似于预处理,固然也能够不处理)并改变事件的传递方向,也就是决定是否容许Touch事件继续向下(子控件)传递,一但返回True(表明事件在当前的viewGroup中会被处理),则向下传递之路被截断(全部子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false,则把事件交给子控件的onInterceptTouchEvent()。
做用:将触摸事件向下层的ViewGroup或View派发。
解释:当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最早到达最顶层 view 的 dispatchTouchEvent ,而后由 dispatchTouchEvent 方法进行分发,若是dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,若是dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,若是 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,若是 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。若是事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而若是传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,并且接收不到下一次事件。
public static final int ACTION_DOWN=0 做用:表示按下的状态。 public static final int ACTION_ UP=1 做用:表示抬起的状态。 public static final int ACTION_MOVE=2 做用:表示移动的状态。
ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent. ViewGroup里的onTouchEvent默认值是false。 View里的onTouchEvent返回默认值是true.这样才能执行屡次touch事件
移动开发者的汇集地,公众号“非著名程序员”,天天一篇原创技术分享和移动互联网知识分享,微信公众号:smart_android,头条号和百度百家帐号都是“非著名程序员”。