国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

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

2019-10-22 18:35:12
字體:
來源:轉載
供稿:網友

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

猜測: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:006-08 09:52:08.395 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:006-08 09:52:08.395 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:006-08 09:52:08.395 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:006-08 09:52:08.441 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.441 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:206-08 09:52:08.442 19424-19424/com.parkingmore E/SlidingMenu: ACTION_MOVE dx:15.47399906-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: ACTION_MOVE getCurrentItem():106-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:206-08 09:52:08.442 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:206-08 09:52:08.459 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.459 19424-19424/com.parkingmore E/SlidingMenu: onInterceptTouchEvent ev:206-08 09:52:08.459 19424-19424/com.parkingmore E/RollViewPager: dispatchTouchEvent ev:306-08 09:52:08.459 19424-19424/com.parkingmore E/RollViewPager: onInterceptTouchEvent ev:306-08 09:52:08.477 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.477 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.495 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.495 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.515 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.515 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.533 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.533 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.551 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.551 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.574 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.574 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.594 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.595 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.611 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.612 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.622 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:206-08 09:52:08.622 19424-19424/com.parkingmore E/SlidingMenu: onTouchEvent ev:206-08 09:52:08.623 19424-19424/com.parkingmore E/SlidingMenu: dispatchTouchEvent ev:1

從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);  }

在SlidingMenu中,做出如下處理

public boolean onInterceptTouchEvent(MotionEvent ev) {    if (MyApplication.mRollViewPagerTouching){      return false;    }    return super.onInterceptTouchEvent(ev);  }

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

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

這里有兩個地方要注意: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);  }

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 砀山县| 新宾| 廉江市| 石棉县| 冀州市| 定日县| 顺昌县| 新疆| 田林县| 龙州县| 余干县| 余江县| 富顺县| 莱芜市| 黑山县| 拉萨市| 安达市| 安多县| 鸡东县| 靖州| 宜春市| 万盛区| 石河子市| 镇雄县| 分宜县| 丹寨县| 抚宁县| 浑源县| 皮山县| 东乌珠穆沁旗| 舞钢市| 岚皋县| 涟源市| 诏安县| 临城县| 宜兰县| 阜宁县| 包头市| 新安县| 祁门县| 满城县|