ViewPager和View的事件響應規則

來源:互聯網
上載者:User

標籤:delay   ima   nbsp   ase   style   get   boolean   判斷   監聽   

案例背景:
  當我們實現viewpager的自動切換介面操作的時候,如果需要增加點擊圖片viewpager停止自動切換,鬆開手指viewpager自動切換又繼續執行的邏輯,正常思維下實現代碼如下所示:

利用handler發送訊息實現viewpager 自動滑動
        if (handler == null) {
            handler = new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    // 實現切換 viewpager 介面
                    // 擷取當前顯示介面的索引
                    int currentItem = mViewPager.getCurrentItem();
                    // 計算下一個介面的索引
                    // 判斷如果切換到最後一個介面,需要重新切換回第一個介面進行操作
                    if (currentItem == imageurls.size()-1) {
                        currentItem=0;
                    }else{
                        currentItem++;
                    }
                    // 設定 viewpager 顯示下一個介面
                    mViewPager.setCurrentItem(currentItem);
                    // 一次切換完成,還需要接著執行第二次
                    handler.sendEmptyMessageDelayed(0, 3000);
                }
            };
            handler.sendEmptyMessageDelayed(0, 3000);// 延遲 3 秒個 handler 發送訊息
        }        


        // 設定 viewpager 條目介面的觸摸事件,實現按下 viewpager 停止滑動,抬起 viewpager 重新滑動
        rootview.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 停止發送 handler 延遲訊息
                handler.removeCallbacksAndMessages(null);// 參數如果是 null ,表示刪除所有的延遲訊息
                break;
            case MotionEvent.ACTION_UP:
                // 重新發送 handler 延遲訊息,實現 viewpager 自動滑動
                handler.sendEmptyMessageDelayed(0, 3000);
                break;
            }
            // 返回 true: 執行觸摸監聽操作, false :不執行
            return true;
            }
        });

  即:在手指按下的時候利用handler發送停止訊息而到當手指抬起的時候發送繼續切換的訊息 然而在實際的操作中我們發現當手指抬起的時候viewpager不能繼續實現自動切換,通過對代碼進行log操作發現手指抬起的時候view並沒有執行up方法而是執行了cancel方法,故代碼修改如下:

// 設定 viewpager 條目介面的觸摸事件,實現按下 viewpager 停止滑動,抬起 viewpager 重新滑動    rootview.setOnTouchListener(new OnTouchListener() {        @Override        public boolean onTouch(View v, MotionEvent event) {            switch (event.getAction()) {                case MotionEvent.ACTION_DOWN:                // 停止發送 handler 延遲訊息                handler.removeCallbacksAndMessages(null);// 參數如果是 null ,表示刪除所有的延遲訊息                break;            case MotionEvent.ACTION_UP:                // 重新發送 handler 延遲訊息,實現 viewpager 自動滑動                handler.sendEmptyMessageDelayed(0, 3000);                break;            case MotionEvent.ACTION_CANCEL:                // 當取消 view 的事件的時候,重新讓 viewpager 自動滑動                handler.sendEmptyMessageDelayed(0, 3000);                break;            }            // 返回 true: 執行觸摸監聽操作, false :不執行            return true;        }    });

即:增加cancel方法的條目在方法內實現繼續發送切換訊息的邏輯。

規則總結:
    1、如果手指緩慢滑動很短的距離,viewpager沒有切換介面,所以認為viewPager和view都可以執行事件,系統不會取消任何控制項的觸摸事件,由我們自己決定處理哪個事件。
    2、如果手指快速滑動很長的距離,viewpager就會執行介面切換,此時view就會執行cancel方法,取消view的觸摸事件,只執行viewPager的觸摸事件。

 

ViewPager和View的事件響應規則

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.