偷工减料的远足

        梦幻王国
真的是千篇一律所梦幻乐园。它以戏元素和华夏传统文化符号巧妙融合,融入顶尖的嬉戏科技。其中不少色都是拒绝错过的,比如由于4D效果做的盘丝洞、生命的才、未来警力……其中的魔法学校最好吸引人口,我跟女儿玩了个别举。

示例五、给View绑定OnTouchListener和OnClickListener监听器。

于EventDispatchActivity的onCreate()方法中添加如下代码,并以EventDispatchLinearLayout和EventDispatchTestView的各艺术的返值都还原成示例一蒙受之状态。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_event_dispatch);
    edtv_test = ViewUtils.find(this, R.id.edtv_test);
    edll_test = ViewUtils.find(this, R.id.edll_test);

    edtv_test.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
            Log.i("————View", "onTouch: 返回 " + false);
            return false;
        }
    });

    edtv_test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
            Log.i("————View", "onClick: ");
        }
    });
}

测试log如下:

01-06 19:35:07.563 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.563 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:true

01-06 19:35:07.573 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-06 19:35:07.573 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.574 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 2 | 是否消耗事件:true

01-06 19:35:07.673 6737-6737/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouch: 返回 false
01-06 19:35:07.674 6737-6737/cn.codingblock.view I/————View: onTouchEvent: 1 | 是否消耗事件:true
01-06 19:35:07.704 6737-6737/cn.codingblock.view I/————View: onClick: 

然后再点修改代码,让onTouch()方法吃事件,也就是是回来true,再观log:

edtv_test.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // 为了log显示的层次更加清晰,这里的TAG使用View的TAG
        Log.i("————View", "onTouch: 返回 " + false);
        return false;
    }
});

log如下:

01-07 11:03:55.411 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-07 11:03:55.412 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

01-07 11:03:55.542 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-07 11:03:55.542 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

01-07 11:03:55.560 2757-2757/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-07 11:03:55.560 2757-2757/cn.codingblock.view I/————View: onTouch: 返回 true

自打log中我们好见见:

  • 否View绑定的OnTouchListener中之onTouch()方法是先行给View的onTouchEvent()方法执行之。如果在onTouch()消耗了风波(返回true),那么事件将无在传递给onTouchEvent()方法,最终为不见面调用onClick()方法。
  • 也View绑定的OnClickListener中之onClick()方法优先级最低,是当全事件流了晚才见面被调用,也不怕是要经过手指的按照下–抬起是过程才见面触发onClick()方法。

小结

以更好的明亮,可以拿事件流看成是一模一样拔人,把ACTION_DOWN类型看做探路人,探路人按规定之线路先走相同举,直到走及View的onTouchEvent这里,如果onTouchEvent返回true,可理解成者路通,后续部队可以恢复。如果回到false,可以解成是路不通,然后探路人再届Layout(ViewGroup)的onTouchEvent中问路通不接入,如果接的言辞后续部队虽毫无再失去View那里了,直接到ViewGroup这来就是得了。而要ViewGroup这里路也短路,那么探路人就不得不去Activity的onTouchEvent那里了,后续部队为一直去Activity的onTouchEvent这里虽好了。


末段想说的凡,本系列文章为博主对Android知识进行再梳理,查缺补漏之学过程,一方面是对好忘记的事物加以复习重新掌握,另一方面相信于重新学习的进程被一定会出伟的初获得,如果你吧时有发生跟我平的想法,不妨关心自己一块儿学学,互相探讨,共同进步!

参考文献:

  • 《Android开发方式探索》

示例三、在示例二的功底及叫ViewGroup消耗事件

修改EventDispatchLinearLayout的onTouchEvent(),让该返回true。

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
    return true;//super.onTouchEvent(event);
}

测试log如下:

01-05 18:34:53.409 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 18:34:53.409 21169-21169/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 18:34:53.410 21169-21169/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:34:53.410 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:true

01-05 18:34:53.420 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 18:34:53.420 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 18:34:53.420 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 2 | 是否消耗事件:true

01-05 18:34:53.470 21169-21169/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 18:34:53.470 21169-21169/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 18:34:53.470 21169-21169/cn.codingblock.view I/——Layout: onTouchEvent: 1 | 是否消耗事件:true

以此种情景下,事件流的ACTION_DOWN先到达View的onTouchEvent,发现其不吃事件,继而返回上级的ViewGroup的onTouchEvent中,发现她而耗事件,事件流的存续有就未在传递让View,也非以调用ViewGroup的onInterceptTouchEvent方法,因为都知晓View不处理事件,所以并未必要再经过onInterceptTouchEvent方法来判定了。

以路程的原因,我要求早至几个钟头,他爽快地答应了。下飞机后直与我们保持联系,为咱介绍芜湖美食与游览路,帮咱询问坐什么车方便。每天游玩儿期间还关注我们到哪里玩儿了;是勿是跑委了;需不需要指路。还能动请我们增加他的便车。不只是我,所有的网评都说他是精心的暖男帅哥。外边他乡,有一个人数关注,少了累累生,多了平客近。

哎是事件分发机制?

说了半天的轩然大波分发机制那究竟是单什么东西呢?我们毫不将其想象的那么高深莫测,不要当心理上吃自己而上阻碍,其实生爱懂,博主的明是:简单来说,事件分发机制就算是Android系统对事件传递过程规定的如出一辙种植事件传递规则,事件还见面随这规则进行分发传递。

在研事件分发机制之前,我们先来确定一下剖析的步子,化整为零,各个击破:

  • 做明白分析目标:MotionEvent。
  • 了解三独办法:dispatchTouchEvent(MotionEvent
    event)、onInterceptTouchEvent(Motion
    event)、onTouchEvent(MotionEvent event)。
  • MotionEvent事件之传递过程
  • 小结

     
住处是自我自小猪app上抄的一样贱独立民宿。交通便民,到方特旅游度假区只来三站地之公交,打出租车为不过七八片钱。附近还有市租赁电动汽车、共享单车。楼下不多就起一样久商业街。

示例二、在示例一的基础及,让View的onTouchEvent不吃事件不时的传递流程

连片下给方的EventDispatchTestView的onTouchEvent返回false:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + false);
    return false;//super.onTouchEvent(event);
}

测试log如下:

01-05 18:18:52.545 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.545 10771-10771/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:18:52.546 10771-10771/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:false
01-05 18:18:52.547 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 0 | 是否消耗事件:true

01-05 18:18:52.629 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 18:18:52.629 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 2 | 是否消耗事件:true

01-05 18:18:52.630 10771-10771/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 18:18:52.630 10771-10771/cn.codingblock.view I/Activity: onTouchEvent: 1 | 是否消耗事件:true

当View的onTouchEvent不吃事件频仍,事件会交ViewGroup的onTouchEvent方法处理,而起log可以视ViewGroup的onTouchEvent默认为不吃事件,所以事件由提交Activity的onTouchEvent方法处理,最终事件流的持续有不再传递给ViewGroup和View,而是一直传送让Activity的onTouchEvent处理。

   
遗憾之地方。除了四期的东神话没有玩全,还有平等要的快乐世界没有工夫错开,鸠兹古镇啊去我们老接近呀。只能等下次了!

示例四、如果以ViewGroup的onInterceptTouchEvent中归了true拦截了事件,整个事件将不再传递给View而是直接到由ViewGroup的onTouchEvent处理。

修改EventDispatchLinearLayout的onInterceptTouchEvent(),让那个返回true。

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    Log.i(TAG, "onInterceptTouchEvent: " + event.getAction() + " | 是否拦截:" + true);
    return true;//super.onInterceptTouchEvent(event);
}

测试log如下:

01-05 19:03:21.788 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:true
01-05 19:03:21.789 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 0 | 是否消耗事件:true
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 19:03:21.819 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 2 | 是否消耗事件:true
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 19:03:21.877 9733-9733/cn.codingblock.view I/——Layout: onTouchEvent: 1 | 是否消耗事件:true

事件分发机制是Android中充分主要之一个知识点,同时为是难关,相信到目前为止很多Android开发者对事件分发机制并从未一个杀系统的认识,当然也席卷博主个人在内。可能在平时的开销工作负我们连从未发现及事件分发机制于至的图,其实它们是天天是的只是我们不晓得而已,就如有些滑冲突、点击事件中的闯等等大多是以事件分发处理不当导致的。想起了博主大学时举行了一个小品种,里面就起了滑动冲突之题材,虽然最后当网上一步步关押在人家的教程也糊里糊涂的解决了,但归根结底不知其所以然,那么今天虽深受咱们共来深切之追究一下轩然大波分发机制吧。

暖男房东:

dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

  • boolean dispatchTouchEvent (MotionEvent event):

分发事件,只要事件能传递至手上View就肯定会调用此方法,其回来回值是一个布尔项目表示是否消耗事件。返回true代表吃事件,事件流的持续有还会随之传递过来;返回false代表不吃事件,事件流的继续有即不再传递给这。

  • boolean onInterceptTouchEvent (MotionEvent ev):

斯办法表示是否拦截MotionEvent事件,只有ViewGroup类型的控件才来其一道。如果此措施返回true表示拦截事件,事件将传递让当下View的onTouchEvent()方法,而不再为其麾下的View传递。如果是道返回false表示不挡事件,事件将传递给下属View的dispatchTouchEvent()。

  • boolean onTouchEvent (MotionEvent event):

此方式用来拍卖MotionEvent,返回值表示是否消耗事件。返回true表示耗事件,那么事件流的累有还会见传递过来;返回false表示未吃事件,事件将提交上级View的onTouchEvent()处理,如果上级View的onTouchEvent()仍然返回false,那么事件将再度付诸上级的顶头上司处理,以此类推,如果各View的onTouchEvent()都非吃事件,那么事件结尾将付诸Activity的onTouchEvent()处理。

上文说了这般多还是休足够具体,先用流程图大体说明一个之上三独主意的涉嫌,及调用流程,下文还见面结合现实示例详细说明以波分发传递着逐条艺术的调用规则。

三者关系约如下图:

MotionEvent事件传递过程

当手指点击屏幕发出一个Touch事件后,事件仍Activity->Window->View的相继依次传递。

第一会见传递给Activity的dispatchTouchEvent(),在此措施中会用出于Window处理,接着事件会传递让根View,根View接收到事件后即会遵循事件分发机制去处理事件。

根View在此地虽是一个ViewGroup,它以承受到事件后会见调用dispatchTouchEvent(),在这个方法中会经过onInterceptTouchEvent()方法判断是否拦截事件,如果onInterceptTouchEvent()返回true就象征她使拦事件,事件将传递给当下ViewGroup的onTouchEvent()。如果onInterceptTouchEvent()放回false就象征她不挡事件,事件将污染给该属下的View,调用下级View的dispatchTouchEvent()。

根View的部属View可能又是一个ViewGroup,如果这样的话其传递流程及根View一样。无论根View的部下View是无是ViewGroup,如果非阻拦事件,最终事件会传递及一个纯View的控件上。

当一个View(纯View控件)接收到事件后,也会见调用其dispatchTouchEvent(),然后以这个方法中会调用当前View的onTouchEvent(),如果onTouchEvent()返回true则代表要处理者事件。如果回去false表示不吃事件,其上司View的onTouchEvent()将受调用,则事件流的继承有不再传递及当下View,在一个事变流中也无见面另行调用当前View的dispatchTouchEvent()。

紧接下通过切实示例来查事件传递的流程:

小屋通透、简洁。入户智能电子门卡,一室一厅一厨房一侍卫,设施健全。我们母女俩停下富富有余,个人感觉客厅放张床,住四单人口还不以为挤。关键是这种布局价格还是不了百。

示例一,默认情况下之风波传递流程

创造3单近乎,一个Activity、一个后续自LinearLayout的View,一个继续自Button的View,并再写他们的dispatchTouchEvent()、onIntercepteTouchEvent()、onTouchEvent(),三只八九不离十及布局文件之代码如下:

  • EventDispatchActivity

/**
 * 事件分发机制测试Activity
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchActivity extends AppCompatActivity {

    private final static String TAG = "Activity";//EventDispatchActivity.class.getSimpleName();

    private EventDispatchTestView edtv_test;
    private EventDispatchLinearLayout edll_test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_dispatch);
        edtv_test = ViewUtils.find(this, R.id.edtv_test);
        edll_test = ViewUtils.find(this, R.id.edll_test);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {

        // 被调用时输出log,event.getAction表示事件的类型,0:ACTION_DOWN,1:ACTION_UP,2:ACTION_MOVE。

        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
        return super.onTouchEvent(event);
    }
}
  • EventDispatchLinearLayout

/**
 * 事件分发机制测试 ViewGroup
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchLinearLayout extends LinearLayout {

    private final static String TAG = "——Layout";//EventDispatchLinearLayout.class.getSimpleName();


    public EventDispatchLinearLayout(Context context) {
        super(context);
    }

    public EventDispatchLinearLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        Log.i(TAG, "onInterceptTouchEvent: " + event.getAction() + " | 是否拦截:" + false);
        return super.onInterceptTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + false);
        return super.onTouchEvent(event);
    }
}
  • EventDispatchTestView

/**
 * 事件分发机制测试 View
 * Created by liuwei on 18/1/5.
 */
public class EventDispatchTestView extends Button {

    private final static String TAG = "————View";//EventDistpatchTestView.class.getSimpleName();

    public EventDispatchTestView(Context context) {
        super(context);
    }

    public EventDispatchTestView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.i(TAG, "dispatchTouchEvent: " + event.getAction() + " | 分发事件");
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG, "onTouchEvent: " + event.getAction() + " | 是否消耗事件:" + true);
        return super.onTouchEvent(event);
    }
}
  • 布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="cn.codingblock.view.event_dispatch.EventDispatchActivity">

    <cn.codingblock.view.event_dispatch.EventDispatchLinearLayout
        android:id="@+id/edll_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#cccccc">

        <cn.codingblock.view.event_dispatch.EventDispatchTestView
            android:id="@+id/edtv_test"
            android:layout_width="300dp"
            android:layout_height="300dp"
            android:layout_margin="10dp"
            android:background="#000000"/>

    </cn.codingblock.view.event_dispatch.EventDispatchLinearLayout>

</LinearLayout>

运作代码,点击EventDispatchTestView(黑色区域),log输出如下(log中的数字代表事件之类型,0:ACTION_DOWN,1:ACTION_UP,2:ACTION_MOVE):

01-05 16:58:05.574 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 0 | 是否拦截:false
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 0 | 分发事件
01-05 16:58:05.574 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 0 | 是否消耗事件:true

01-05 16:58:05.611 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 2 | 是否拦截:false
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 2 | 分发事件
01-05 16:58:05.611 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 2 | 是否消耗事件:true

01-05 16:58:05.619 23295-23295/cn.codingblock.view I/Activity: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.619 23295-23295/cn.codingblock.view I/——Layout: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.619 23295-23295/cn.codingblock.view I/——Layout: onInterceptTouchEvent: 1 | 是否拦截:false
01-05 16:58:05.620 23295-23295/cn.codingblock.view I/————View: dispatchTouchEvent: 1 | 分发事件
01-05 16:58:05.620 23295-23295/cn.codingblock.view I/————View: onTouchEvent: 1 | 是否消耗事件:true

出于log可以观看ViewGroup的onInterceptTouchEvent方法默认是不阻拦事件之,View的onTouchEvent方法默认消耗事件。事件流的ACTION_DOWN类型Motion
Event率先到达View的onTouchEvent方法吃,此时onTouchEvent方法返回true,表示如处理事件,所以事件流的接续有仍通过log中的流水线到达了View的onTouchEvent方法吃。

图来源网络

MotionEvent

实际点击事件的散发过程就是是指向MotionEvent事件之散发过程,当用户点击操作以下后,MotionEvent事件随后发生并通过一定之规则传递至指定的View上,这个传递的历程和规则就是是事件分发机制。

假定点击操作触发MotionEvent事件是一个风波流或说是一个波序列,其突出的波类有如下三种:

  • MotionEvent.ACTION_DOWN:手指刚点下屏幕时接触此类型。
  • MotionEvent.ACTION_MOVE:手指在屏幕及移动时见面一再碰此类型。
  • MotionEvent.ACTION_UP:手指在屏幕上抬起时接触此类型。

倘特别注意的是,通常情况下一个MotionEvent事件序列包含一个 ACTION_DOWN
若干个 ACTION_MOVE 和 ACTION_UP
是一个一体化的风波序列。(点下来就抬起指头时,会独自来 ACTION_DOWN 和
ACTION_UP,这为是一个整的波序列)

                            图不了!

(鸠兹古镇)

     
全国发广大方特,我特别忙碌,12载之女儿温馨搜遍手机,决定去芜湖。理由来次:

     
东方神话是方特的四期工程,比打前几乎冀越来越的惊险刺激也进一步有东方神韵。我们先是逛了发生中华特点的非遗小镇,里面商品价格合理,小小的置了瞬间。没有扣留文成公主出嫁的演艺就失去寻找各种稀奇古怪体验了,我们随女娲娘娘炼五彩石补天;和梁山伯祝英台一起感受千古蝶恋,和老牛一起见证牛郎织女的爱恋,穿过地府体味灵魂的一起,站于林子飞上生和方的人数一块大叫,在雷峰塔外感受跳楼机的惊悚……不过,女儿心心念念的双层木马被失去了,我的飞越河谷也尚未玩成,还有无限多刺激的档次尚未敢品尝,只能留下在遗憾了。

       
上学期和女儿打赌,如果它会于期待中期末都考进大榜15称,我不怕带她去一个欣赏的都市旅游。女儿期中第十三称作,期末第九号称,愿望是错开湖南羁押《快乐大本营》。这个愿望让自家非常窘迫。因为【快本】不出售票,只发生黄牛。我到处打听,一摆票价由1200到1800免抵。正遇见暑期黄金档,票价更是居高不下。后来,懂事的闺女决定转行程,去方特旅游度假区玩。她说一样摆放门票可玩四独方特还松,合算。

     
我从来不扣留其他攻略就同意了幼女的见。即是如此一个粗制滥造的支配还是成了今年假日不过划算、幸福、奇妙、惬意的旅程。

     
水上世界汇集了各种水上项目,可是多档次女不敢玩,比如非常喇叭、小喇叭、高些的滑梯。不过我们要悠哉悠哉的游戏了三不成漂流。中间看了同样会那个吸引眼球的水上飞人表演,演员们踏上在高水柱在半空连续做出前后空翻等各种急难动作,引来一阵阵掌声和尖叫声。

其次、离苏杭深近,可以错过解一下美景。

    相比后来底上海迪士尼,个人觉得方特更加的经济,也尤为人性化一些。

如出一辙、芜湖来四独方特,可以痛快的打

房主是只青春的暖男帅哥。帅!有图也求证。

图来源网络

夜晚还有舞台歌舞,烟花表演和花车表演。穿插其中的卡通人物和少儿的交互愈加吃女带诸多欢快。

虽有点小遗憾,但这次的芜湖之实践绝对是幼女心中之快乐记忆。

经济小屋:5588葡京线路

图形来源于网络

    只有近才能真切感受及的法力

(丛林飞龙—木质过山车)

       
方特旅游度假区由华强文化科技集团密切打造,是会师主题公园、酒店餐饮、休闲游戏为一体的综合性休闲漫游度假区。在芜湖发四老大主题公园。因为时间少我们特去了睡梦王国、水上世界和东神话。每个主题乐园都用了一整天之时空,玩的不亦乐乎。

   
在每个方特游玩后底老二上,我同女儿还如扑在铺上大半天用来休养生息。不甘于意动的上午尽管点份汁浓味美的小笼包要笋丁烧麦。恢复体力的黄昏就手拉手去逛逛夜市和大排挡。随意找个摊子点份小龙虾,一边谈笑,一边享用人造夏风(哈哈,风扇而已)。返回时或许带回几份软糯香甜的蛋糕,或于附近超市采购相同积零食、水果跟姑娘一起泡夜晚下。

思念了解每个园的事无巨细攻略只有等下几乎欲了!

奇妙方特:

中意时光:

还有故事唯美结尾震撼的水漫金山;室内过山车秦陵历险……。除了定位的大大小小路,我们还观看了炫酷的花式篮球,惊险而幽默的高台跳水,集舞美,灯光、武术、杂技也同样身的重型舞台剧【猴王】。

(雷峰塔——跳楼机)