• Android事件分发原理


    终于用上了word 2013来写博客,感觉真是老好了,以前在网页上写,老是要把网页拖上拖下的,每次都要吐一升老血啊,现在用上本地的word,瞬间感觉好多了。还有感谢为word写插件的这个大神,代码高亮真是不错。

       

    上一次写了android按钮点击事件是怎么执行的,涉及到了android的touch 和 click事件,粗略地看了一下源码,解释了一下android Touch和Click事件的流程。这一次,我要继续记录我从Tinera和郭大神那里学习到的知识,自己动手实践一番。

       

    首先,上次说到,当你点击一个按钮的时候,你的ACTION_DOWN事件会被dispatch到你点击的按钮的dispatchTouchEvent()方法,那么我们不禁要想,如果我要在一个按钮父布局里面也放一个touch或者click方法,那么点击这个按钮,会不会调用这个父布局的相应的代码呢?

    我们来实验一下:

    我们看到,外层的touch事件是不会抢走内层的touch事件的,同样click也是如此。那么dispatchTouchEvent()事件是从里面往外面传的喽,当然不是得,现在只需要知道,传递是从外层往内层传的,只是外层的布局事件没有"阻拦"这个事件的传递而已。

     1 button.setOnTouchListener(new View.OnTouchListener() {
     2             @Override
     3             public boolean onTouch(View view, MotionEvent event) {
     4                 Log.d("MainActivity", "touch called");
     5                 return true;
     6             }
     7         });
     8         relativeLayout1.setOnTouchListener(new View.OnTouchListener() {
     9             @Override
    10             public boolean onTouch(View view, MotionEvent event) {
    11                 Log.d("MainActivity", "relative touch called");
    12                 return false;
    13             }
    14         });

    我定义了一个MyLayout,在其里面画上一个按钮,然后为他们俩都注册了touch事件,然而只有按钮触发了。

    那么为什么说事件是从外往里面传递的呢,这不是说不通吗?既然MyLayout首先接收了事件,为什么要传递,而不是自己处理呢,等等,自己处理就坏了,你点击按钮,然后

    被外面的这个viewGroup响应调了,有什么用啊。因此我们要想为什么是从外层往里层而不是从里层往外面传递?好吧,先来实验一下,我们在MyLayout里面重新写一下

    onInterceptTouchEvent()这个函数,这个函数在viewgroup里面,默认返回false的,并且只有一句返回。它有什么用呢,先来来看看ViewGroup的dispatchTouchEvent()方法

     

  • 相关阅读:
    Yii学习系列:Yii视频讲义——前篇(转)
    Yii框架tips(转)
    如何学习Javascript
    浅谈程序猿简历的写法,你会如何写你的简历呢。(转)
    浅谈程序猿的职业规划,看你如何决定自己的未来吧。(转)
    软件授权协议有什么作用,例如GPL、Apache License、CDDL、EPL这些协议有什么区别?
    开源软件授权协议详解(GPL/MPL/LGPL/BSD/Apache Licence/Creative Commons/MIT)
    [Yii][RBAC]Yii中应用RBAC完全指南
    Yii之权限管理扩展 srbac
    YII 权限管理
  • 原文地址:https://www.cnblogs.com/lout/p/4844704.html
Copyright © 2020-2023  润新知