美文网首页程序员
Android Touch事件传递机制

Android Touch事件传递机制

作者: 饮水思源为名 | 来源:发表于2018-08-06 14:41 被阅读116次

    简介:

      Touch事件的传递机制与生活贴近,从父布局开始一步一步的向下分发事件。分发事件时调用boolean dispatchTouchEvent(MotionEvent ev);方法。此方法一般不重写它。而直到莫一个控件能够完成此事件时,调用boolean onTouchEvent(MotionEvent event)方法,即可结束。如果直到醉下层的一个view都没发处理这个,就会往父布局回传,依次调用boolean onTouchEvent(MotionEvent event)方法,直到回到最顶层的布局。
      Touch事件传递时,每次分发之后,会调用拦截方法boolean onInterceptTouchEvent(MotionEvent ev)方法,拦截后由拦截者来执行。
      Touch事件传递拥有记忆功能,处理了一次事件传递,假定底层布局都没发完成事件,最后是由顶层父布局自己处理的。那么,相同事件再次产生的时候,顶层布局就不会向下分配,而是自己直接处理事件。值得注意的是这个记忆只会在一系列事件完成之前有效,也就是从ACTION_DOWN事件开始,直到后续事件 ACTION_MOVE,ACTION_UP结束后,“记忆”的信息就会清除。

    生活例子:

    话说一家软件公司,来一个任务,分派给了开发经理去完成:
    开发经理拿到,看了一下,感觉好简单,于是
    开发经理:分派给了开发组长
    开发组长:分派给了自己组员(程序员)
    程序员:分派给了自己带的实习生。
    实习生:好苦逼,无法分派,怎么办啊?只能自己干了
    但是实习生能不能做好,有两种情况了。

    情景一:

      实习生:经过一段时间的研究,琢磨,熬夜,奋斗,死敲,皇天不负有心人啊,完成了。
      后来又来一个类似的任务,也按着这样传递下去了(开发经理->开发组长->程序员->实习生),又有实习生完成了。

    情况二:

      实习生:经过一段时间的研究,琢磨,就是毫无头绪,无法完成,只能求教师傅(程序员)了。
      程序员:啊,我怎么没留意就给实习生搞了,这任务好难啊,自己研究下,也没有头绪,没办法只能请求组长了。
      开发组长:这任务不难啊,怎么我底下的人都不会了,没办法,只能自己搞了,经过,一段时间,完成了,感想,以后要是又有跟这个很类似的任务,我就自己弄了,不给他们弄了。
      后来又来一个类似的任务,传递是这样的:
    开发经理:分派给开发组长
    开发组长:啊,又是跟着上一个很类似的任务,我自己弄吧,没过多久也完成了!

    总结:

      可以看出这个公司的小例子正好对应了Touch事件传递机制。一层一层往下传递,当下面无法完成时,又网上回传。而当同样事件出现时,同样展现了他的记忆功能,不需要往下传递做重复的事情,直接由上次做了这个事件的人直接处理。

    程序例子:

      首先创建四个类,分配继承Activity,FrameLayout,LinearLaytou,TextView。然后分别重写分发、拦截、处理方法,打印Log信息。这里的Activity可以看做开发经理,FrameLayout是开发组长,LinearLayout是程序员,TextView是实习生。


    情景一:

      我们将TextView的onTouchEvent返回值设置为true即实习生成功处理了问题。点击蓝色区域,那么应该发生的传递机制为任务一级一级的传下来,TextView(实习生)之后,任务被完成了。当再遇到相同的任务时,任务还是会被一级一级的传下来,最后由TextView(实习生)解决。


      此图是对蓝色区域完成了一次点击(按下、抬起)后产生的log信息。可以看出父布局依次执行分发和拦截方法,任务一级一级的被传递到了作为没有子布局的TextView上。而TextView因为返回值设置为ture,代表解决了问题,任务结束。
      而手指抬起时再次发生了Touch事件,任然传递至TextView被解决。

    情景二:

      我们将TextView的onTouchEvent方法设置为false(代表实习生不能解决),而将FrameLayout的onTouchEvent方法设置为true(代表开发组长能解决)。同样点击蓝色区域,那么传递的方式应该是先一级一级的分发给下属处理,到了TextView(实习生)后,没有下属了,他又处理不了,就往上回传递,知道传递到FrameLayout(开发组长)后,他将任务处理了。任务结束。
      第二次类似的任务来了,Activity(开发经理)将任务同样的分发下去,FrameLayout(开发组长)接到任务后,发现是跟上次相似的任务,下面的又不会,直接就自己解决了。这里体现出了Touch时间传递机制的记忆性。



      此图是点击蓝色区域后log打印出的信息,值得注意的是,当FrameLayout按照传递的记忆性直接执行完成任务时,是不会触发拦截方法的。


    情景三:
      当拦截方法进行拦截时(即拦截方法返回值为true),任务即为拦截者进行处理,若无法处理,直接往上级回传。


      此图为LinearLayout(程序员)进行了拦截,然后开始处理,但是发现处理不了, 然后就直接往上传递,被FrameLayout(开发组长)处理了。然后相似的任务来时,FrameLayout(开发组长)直接就处理了。

    相关文章

      网友评论

        本文标题:Android Touch事件传递机制

        本文链接:https://www.haomeiwen.com/subject/bcxgvftx.html