成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Android的事件響應機制

1:View的事件響應機制(控件:如TextView,ImageView,Button等)

成都創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都網(wǎng)站設計、做網(wǎng)站和網(wǎng)站改版、網(wǎng)站營銷服務,追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計客戶上千,服務滿意度達97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運用,我們將一直專注品牌網(wǎng)站建設和互聯(lián)網(wǎng)程序開發(fā),在前進的路上,與客戶一起成長!

     

     在執(zhí)行onTouchListener方法時候,(view這里代表為控件)

                 view.setOnTouchListener (new OnTouchListener() {

                

                 @Override

                 public boolean onTouch( View v, MotionEvent event) {

                      return false ;

                 }

            });

    事件分發(fā)的時候會執(zhí)行publicboolean dispatchTouchEvent(MotionEvent event)

  a:先進行if判斷

         if (li != null && li .mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED

                    && li .mOnTouchListener .onTouch (this, event)) {

                return true ;

            }

      return onTouchEvent(event) ;

     li就是OnTouchListener的實現(xiàn)類,不為null,第二個條件判斷控件是否可用,一般恒成立,主要就看第三個條件了。

           return true:就代表響應所有事件。

           return false:就會執(zhí)行onTouchEvent方法了。

     b:setOnTouchListener方法返回了false

           在onTouchEvent方法中,如果控件具備點擊事件,在action_up中回調(diào)執(zhí)行onClick的點擊事件,并且返回true,響應所有事件。如果控件不具備點擊事件,就會返回false,也進入不了switch中。

2:ViewGroup的事件響應機制

     

     ViewGroup的事件響應機制主要分為2部分:1:ViewGroup攔截了事件,2:ViewGroup沒有攔截事件

              /*

      * return true  攔截了事件

      * return false 沒有攔截事件,往內(nèi)部傳遞

      */

     @Override

     public boolean onInterceptTouchEvent( MotionEvent ev) {

            return true ;

     }

   1:攔截了事件:

    那么ViewGroup就會去處理事件,在源碼中最后還是調(diào)用View的dispatchTouchEvent方法,由其決定是否響應,onTouchEventListener中return了true,就響應了事件,return了false,那么就去判斷當前控件(布局)是不是可以被點擊,測試了一次ListView,ListView點擊的時候響應了事件。ListView無論是不是中斷,都會由View的dispatchTouchEvent方法決定,ListView可以被點擊。

    2:沒有攔截事件:

    最外層的ViewGroup先捕獲到事件,計算出點擊的位置,遍歷自己的孩子,傳遞給對應的ViewGroup,然后第二層是不是攔截?。坎粩r截,繼續(xù)遍歷,找到具體點擊的地方的控件view。

     控件view會去通過View的dispatchTouchEvent方法的返回值判斷是不是響應了點擊事件,return true;響應了,那么結(jié)束了。如果return false;了沒有響應,那么事件會向回傳遞,自己的父親回去嘗試響應了。同樣,通過dispatchTouchEvent來進行決定是不是響應了事件。

示例代碼:

1:攔截事件

自定義控件

public class MyLinearLayout extends LinearLayout {


     public MyLinearLayout (Context context , AttributeSet attrs ) {

            super(context , attrs );

     }

     @Override

     public boolean onInterceptTouchEvent( MotionEvent ev) {

            return true ;

     }

}

MainActivity

public class MainActivity extends Activity {


     private LinearLayout my_ll;

     private Button button;

     private TextView textView;

     @Override

     protected void onCreate( Bundle savedInstanceState) {

            super.onCreate (savedInstanceState );

           setContentView (R .layout .activity_main);

           

            my_ll = (LinearLayout ) findViewById (R .id .my_ll);

            button = (Button ) findViewById (R .id .button);

            textView = (TextView ) findViewById (R .id .text);

           

            my_ll. setOnTouchListener(new OnTouchListener() {

                

                 @Override

                 public boolean onTouch( View v, MotionEvent event) {

                     System .out.println( "Linearlayout:"+event .getAction ());

                      return true ;

                 }

            });

           

            textView. setOnTouchListener(new OnTouchListener() {

                

                 @Override

                 public boolean onTouch( View v, MotionEvent event) {

                     System .out.println( "TextView:"+event .getAction ());

                      return false ;

                 }

            });

           

            button. setOnTouchListener(new OnTouchListener() {

                

                 @Override

                 public boolean onTouch( View v, MotionEvent event) {

                     System .out.println( "Button:"+event .getAction ());

                      return false ;

                 }

            });

           

//         my_ll.setOnClickListener(new OnClickListener() {

//              

//              @Override

//              public void onClick(View v) {

//                   System.out.println(" Linearlayout");

//              }

//         });

     }

}

分析:my_ll不再向里面的Button和TextView傳遞了,自己處理,自己在my_ll.setOnTouchListener中返回了false,my_ll又不具備點擊事件,當然就只能打印出LineraLayout::0了,如果我們給其設置了點擊事件,那么當然會打印出down,up,click三者了。my_ll.setOnTouchListener中返回了true,自己也進行了處理,不過就只能打印出down,up了。


2:不攔截事件

分析:點擊button,響應了事件,其可以點擊,肯定會響應。點擊TextView時候,其默認沒有點擊事件,只能打印down了,然后不響應,往回傳遞,my_ll去響應,my_ll又會通過View的dispatchTouchEvent去處理了。我們這里在my_ll.setOnTouchListener中返回了true的話,肯定會打印如下:TextView的down,MyLinearlayout的down,up了。

文章名稱:Android的事件響應機制
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article14/ijjide.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站收錄建站公司、網(wǎng)站內(nèi)鏈、網(wǎng)站建設、網(wǎng)站導航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
阜新| 枞阳县| 桂阳县| 芮城县| SHOW| 奉新县| 广水市| 双柏县| 龙山县| 淄博市| 阳信县| 耿马| 铅山县| 大余县| 丰宁| 湟中县| 河南省| 祁门县| 天全县| 东莞市| 隆化县| 开平市| 新干县| 樟树市| 黄冈市| 闻喜县| 长岭县| 驻马店市| 无棣县| 九江市| 屯门区| 乐东| 南京市| 乌兰浩特市| 娱乐| 湾仔区| 乐亭县| 博野县| 北票市| 麟游县| 陇川县|