日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

onInterceptTouchEvent和onTouchEvent調(diào)用時序

 shaobin0604@163.com 2010-07-15

onInterceptTouchEventonTouchEvent調(diào)用時序

onInterceptTouchEvent()ViewGroup的一個方法,目的是在系統(tǒng)向該ViewGroup及其各個childView觸發(fā)onTouchEvent()之前對相關(guān)事件進(jìn)行一次攔截,Android這么設(shè)計的想法也很好理解,由于ViewGroup會包含若干childView,因此需要能夠統(tǒng)一監(jiān)控各種touch事件的機(jī)會,因此純粹的不能包含子view的控件是沒有這個方法的,如LinearLayout就有,TextView就沒有。 

onInterceptTouchEvent()使用也很簡單,如果在ViewGroup里覆寫了該方法,那么就可以對各種touch事件加以攔截。但是如何攔截,是否所有的touch事件都需要攔截則是比較復(fù)雜的,touch事件在onInterceptTouchEvent()onTouchEvent以及各個childView間的傳遞機(jī)制完全取決于onInterceptTouchEvent()onTouchEvent()的返回值。并且,針對down事件處理的返回值直接影響到后續(xù)moveup事件的接收和傳遞。 

關(guān)于返回值的問題,基本規(guī)則很清楚,如果return true,那么表示該方法消費了此次事件,如果return false,那么表示該方法并未處理完全,該事件仍然需要以某種方式傳遞下去繼續(xù)等待處理。

SDK給出的說明如下:

·  You will receive the down event here.

·  The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.

·  For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().

·  If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.

 

由于onInterceptTouchEvent()的機(jī)制比較復(fù)雜,上面的說明寫的也比較復(fù)雜,總結(jié)一下,基本的規(guī)則是:

1.       down事件首先會傳遞到onInterceptTouchEvent()方法

2.       如果該ViewGrouponInterceptTouchEvent()在接收到down事件處理完成之后return false,那么后續(xù)的move, up等事件將繼續(xù)會先傳遞給該ViewGroup,之后才和down事件一樣傳遞給最終的目標(biāo)viewonTouchEvent()處理。

3.       如果該ViewGrouponInterceptTouchEvent()在接收到down事件處理完成之后return true,那么后續(xù)的move, up等事件將不再傳遞給onInterceptTouchEvent(),而是和down事件一樣傳遞給該ViewGrouponTouchEvent()處理,注意,目標(biāo)view將接收不到任何事件。

4.       如果最終需要處理事件的viewonTouchEvent()返回了false,那么該事件將被傳遞至其上一層次的viewonTouchEvent()處理。

5.       如果最終需要處理事件的view onTouchEvent()返回了true,那么后續(xù)事件將可以繼續(xù)傳遞給該viewonTouchEvent()處理。

 

下面用一個簡單的實驗說明上述復(fù)雜的規(guī)則。視圖自底向上共3層,其中LayoutView1LayoutView2就是LinearLayout, MyTextView就是TextView

對應(yīng)的xml布局文件如下:

<?xml version="1.0" encoding="utf-8"?>

<com.touchstudy.LayoutView1 xmlns:android="http://schemas./apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent" >

    <com.touchstudy.LayoutView2

        android:orientation="vertical"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:gravity="center">

       <com.touchstudy.MyTextView 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:id="@+id/tv"

            android:text="AB"

            android:textSize="40sp"

            android:textStyle="bold"

            android:background="#FFFFFF"

            android:textColor="#0000FF"/>

   </com.touchstudy.LayoutView2>

</com.touchstudy.LayoutView1>

 

下面看具體情況:

1.       onInterceptTouchEvent()處理down事件均返回false,onTouchEvent()處理事件均返回true

------------------------------------------------------------------------------------------------------------------------------

04-11 03:58:42.620: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:58:42.620: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:58:42.620: DEBUG/MyTextView(614): onTouchEvent action:ACTION_DOWN

04-11 03:58:42.800: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_MOVE

04-11 03:58:42.800: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_MOVE

04-11 03:58:42.800: DEBUG/MyTextView(614): onTouchEvent action:ACTION_MOVE

…… //省略過多的ACTION_MOVE

04-11 03:58:43.130: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_UP

04-11 03:58:43.130: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_UP

04-11 03:58:43.150: DEBUG/MyTextView(614): onTouchEvent action:ACTION_UP

------------------------------------------------------------------------------------------------------------------------------

這是最常見的情況,onInterceptTouchEvent并沒有做任何改變事件傳遞時序的操作,效果上和沒有覆寫該方法是一樣的??梢钥吹?,各種事件的傳遞本身是自底向上的,次序是:LayoutView1->LayoutView2->MyTextView。注意,在onInterceptTouchEvent均返回false時,LayoutView1LayoutView2onTouchEvent并不會收到事件,而是最終傳遞給了MyTextView。

 

2.       LayoutView1onInterceptTouchEvent()處理down事件返回true

MyTextViewonTouchEvent()處理事件返回true

------------------------------------------------------------------------------------------------------------------------------

04-11 03:09:27.589: DEBUG/LayoutView1(446): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:09:27.589: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_DOWN

04-11 03:09:27.629: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_MOVE

04-11 03:09:27.689: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_MOVE

…… //省略過多的ACTION_MOVE

04-11 03:09:27.959: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_UP

------------------------------------------------------------------------------------------------------------------------------

Log可以看到,由于LayoutView1在攔截第一次down事件時return true,所以后續(xù)的事件(包括第一次的down)將由LayoutView1本身處理,事件不再傳遞下去。

 

3.       LayoutView1LayoutView2onInterceptTouchEvent()處理down事件返回false,

MyTextViewonTouchEvent()處理事件返回false

LayoutView2onTouchEvent()處理事件返回true

----------------------------------------------------------------------------------------------------------------------------

04-11 09:50:21.147: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/LayoutView2(301): onInterceptTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/MyTextView(301): onTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_DOWN

04-11 09:50:21.176: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_MOVE

04-11 09:50:21.176: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_MOVE

04-11 09:50:21.206: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_MOVE

04-11 09:50:21.217: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_MOVE

…… //省略過多的ACTION_MOVE

04-11 09:50:21.486: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_UP

04-11 09:50:21.486: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_UP

----------------------------------------------------------------------------------------------------------------------------

可以看到,由于MyTextViewonTouchEvent()return falsedown事件被傳遞給其父view,即LayoutView2onTouchEvent()方法處理,由于在LayoutView2onTouchEvent()return true,所以down事件傳遞并沒有上傳到LayoutView1。注意,后續(xù)的moveup事件均被傳遞給LayoutView2onTouchEvent()處理,而沒有傳遞給MyTextView。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多