1. 程式人生 > >Android側滑菜單和輪播圖之滑動沖突

Android側滑菜單和輪播圖之滑動沖突

解決 float 自定義 else switch hid 通過 表示 猜想

接手一個項目,有一個問題需要修改:輪播圖不能手動滑動,手動滑動輪播圖只會觸發側滑菜單。

猜測:viewpager控件(輪播圖)的觸摸事件被SlidingMenu控件(側滑菜單,非第三方項目,乃是上個開發人員自定義的)攔截了。

基於這個猜測,我自定義一個ViewPager,重寫dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,分別在這三個方法中打印log;

重寫SlidingMenu的dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,同樣打印log。

重新編譯運行,手滑輪播圖,log如下:

技術分享
06-08 09:52:08.394 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:0
06-08 09:52:08.395 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:0
06-08 09:52:08.395 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:0
06-08 09:52:08.395 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:0
06-08 09:52:08.441 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.441 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:2
06-08 09:52:08.442 19424-19424/com.parkingmore E/SlidingMenu: ACTION_MOVE dx:15.473999
06-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: ACTION_MOVE getCurrentItem():1
06-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:2
06-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:2
06-08 09:52:08.459 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.459 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:2
06-08 09:52:08.459 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:3
06-08 09:52:08.459 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:3
06-08 09:52:08.477 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.477 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.495 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.495 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.515 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.515 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.533 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.533 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.551 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.551 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.574 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.574 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.594 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.595 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.611 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.612 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.622 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:2
06-08 09:52:08.622 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:2
06-08 09:52:08.623 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:1
View Code

從log中可以看出,該開始,還能將滑動事件傳遞給ViewPager,之後,就被SlidingMenu攔截了。這個log證實了這個猜想是正確的。

知道了原因就好解決了,我現在要考慮的是:要達到什麽樣的效果。

預期效果:可以正常滑動輪播圖,當輪播圖在第一張時,可以滑到側滑菜單。

網上有人分享過類似的問題。我這裏也借鑒了一下。

先來實現第一個功能:可以正常滑動輪播圖。

可以設一個全局變量:public static boolean mRollViewPagerTouching;

用來表示是否在觸摸輪播圖。

在自定義ViewPager中,判斷是否在觸摸輪播圖

技術分享
public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_DOWN:
                MyApplication.mRollViewPagerTouching = true;
                break;
            case MotionEvent.ACTION_UP:
                MyApplication.mRollViewPagerTouching = false;
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
View Code

在SlidingMenu中,做出如下處理

技術分享
public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (MyApplication.mRollViewPagerTouching){
            return false;
        }
        return super.onInterceptTouchEvent(ev);
    }
View Code

重新編譯運行,可以正常滑動輪播圖,但是當輪播圖在第一張時,不能滑到側滑菜單。

現在來做第二個功能:當輪播圖在第一張時,可以滑到側滑菜單。

這裏有兩個地方要註意:1.當輪播圖在第一張時;2.由於我的側滑菜單是在左邊,需要手指向右滑動進入側滑菜單,所以,第二個條件,應該是右滑。

在以上的基礎上,修改自定義ViewPager代碼

技術分享
public boolean dispatchTouchEvent(MotionEvent ev) {
        //在觸發時回去到起始坐標
        float x = ev.getX();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_MOVE:
                //獲取到距離差
                float dx = x - downX;
                //防止是按下也判斷
                if (Math.abs(dx) > 8) {
                    //通過距離差判斷方向
                    if (dx > 0) {
                        //                                "右";
                        if (getCurrentItem() == 0) {
                            MyApplication.mRollViewPagerTouching = false;
                        } else {
                            MyApplication.mRollViewPagerTouching = true;
                        }
                    } else {
                        //                                "左";
                        MyApplication.mRollViewPagerTouching = true;
                    }
                }
                break;
            case MotionEvent.ACTION_DOWN:
                //將按下時的坐標存儲
                downX = x;
                MyApplication.mRollViewPagerTouching = true;
                break;
            case MotionEvent.ACTION_UP:
                MyApplication.mRollViewPagerTouching = false;
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
View Code

再次編譯運行,成功達到預期效果。

ps:簡單的功能,簡單的分享。

 

Android側滑菜單和輪播圖之滑動沖突