zoukankan      html  css  js  c++  java
  • [学习总结]5、Android的ViewGroup中事件的传递机制(二)

    下面是第一篇的连接

    Android的ViewGroup中事件的传递机制(一)

    关于onInterceptTouchEvent和onTouchEvent的详细解释。

     1 public class MainActivity extends Activity {
     2     Group1 group1;
     3     Group2 group2;
     4     MyTextView myTv;
     5 
     6     /** Called when the activity is first created. */
     7     @Override
     8     public void onCreate(Bundle savedInstanceState) {
     9         super.onCreate(savedInstanceState);
    10 
    11         //--group1
    12         //----|
    13         //-------group2
    14         //---------|
    15         //------------myTv
    16 
    17         group1 = new Group1(this);
    18         group2 = new Group2(this);
    19         myTv = new MyTextView(this);
    20         group2.addView(myTv, new LayoutParams(LayoutParams.FILL_PARENT,
    21                 LayoutParams.FILL_PARENT));
    22         group1.addView(group2, new LayoutParams(LayoutParams.FILL_PARENT,
    23                 LayoutParams.FILL_PARENT));
    24         setContentView(group1);
    25     }
    26 }

    分别重写Group1和Group2的onInterceptTouchEvent和onTouchEvent方法,重写MyTextView的onTouchEvent方法,最终得到的控件层次结构如下:

    1.在默认返回值情况下logcat输出如下:

    测试后可知默认情况下和所有方法返回值为false的结果一致,down事件的捕获顺序onInterceptTouchEvent先于onTouchEvent,由于onTouchEvent返回值为false,down事件没被消化,后续的move和up事件没有出现,同时逆序返回到父控件的onTouchEvent方法来捕获,如下图所示:

    2.所有onTouchEvent返回值为true情况下logcat输出如下

    输出结果可以看出子控件MyTextView消化了down事件,后续的move和up事件正常捕获,由于down事件被消化,上层的onTouchEvent方法不执行,如下图所示:(三箭头分别指down、move、up事件)

    既然如此,如果MyTextView中onTouchEvent方法返回为false,而group1和group2的onTouchEvent方法返回true的结果自然也就如下图的顺序了:

    测试输出结果证明了这一猜测顺序,

    注意:可能有人对这种情况比较疑惑,ACTION_DOWN还好理解,但是ACTION_MOVE为什么没有经历myTv,而且ACTION_MOVE只经历了group1的onInterceptTouchEvent和group2的onTouchEvent而没有经历group2的onInterceptTouchEvent,我开始也费解,后来想想也是,大家对比第1条,由于onTouchEvent返回了false而没有消耗down事件导致后续的move和up都没有出现,这里也是一样由于myTv中的onTouchEvent返回了false也就是说没有消耗down事件,那么后面的move和up也都不会出现在这个view里面,但是group2截获到了down事件,但后来的move为什么group2中的onInterceptTouchEvent没有执行到呢,原因大家不要忘记了onInterceptTouchEvent的初衷是什么,返回false是让它的子view或viewgroup类处理,而group2的子控件显然是myTv而myTv的onTouchEvent返回了false也就是接收不到后续的move和up事件,也就没必要经过onInterceptTouchEvent来继续分发了(因为分发了也还是接收不到),经过group2的onTouchEvent因为它返回的是true,截获了事件并且消耗了事件。

    3.当某个GroupView中的onInterceptTouchEvent方法返回值为true情况下logcat输出如下(如group2):

    如果在该方法返回值中返回true,那么子控件将获取不到任何点击事件,转而向自身的onTouchEvent方法转发,如下图所示:

    如果onTouchEvent方法返回值都为true,那么根据规律结果就如下图顺序触发:

    最后logcat的结果证实了这一猜测,

    根据这一顺序规律我们便可复写GroupView中的onInterceptTouchEvent来控制事件的响应者。

    测试的demo:下载demo

    [学习总结]4、Android的ViewGroup中事件的传递机制(一)

  • 相关阅读:
    Golang 函数,我觉得比较有意思的几个东西
    Golang 基础
    JVM快速扫盲篇
    好用的Scrum (敏捷开发)工具有哪些?推荐三个顶级的Scrum 管理工具
    一篇文章帮助你理解跑马灯的滚动原理
    如何来理解Python中的字典数据类型
    一篇文章带你了解HTML的网页布局结构
    通过webgoat-xxe、jwt学习Java代码审计
    DNS隧道
    KTL 一个支持C++14编辑公式的K线技术工具平台
  • 原文地址:https://www.cnblogs.com/androidxiaoyang/p/3719032.html
Copyright © 2011-2022 走看看