Android側(cè)滑菜單和輪播圖之滑動沖突問題
接手一個項目,有一個問題需要修改:輪播圖不能手動滑動,手動滑動輪播圖只會觸發(fā)側(cè)滑菜單。
猜測:viewpager控件(輪播圖)的觸摸事件被SlidingMenu控件(側(cè)滑菜單,非第三方項目,乃是上個開發(fā)人員自定義的)攔截了。
基于這個猜測,我自定義一個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
從log中可以看出,該開始,還能將滑動事件傳遞給ViewPager,之后,就被SlidingMenu攔截了。這個log證實了這個猜想是正確的。
知道了原因就好解決了,我現(xiàn)在要考慮的是:要達到什么樣的效果。
預期效果:可以正?;瑒虞啿D,當輪播圖在第一張時,可以滑到側(cè)滑菜單。
網(wǎng)上有人分享過類似的問題。我這里也借鑒了一下。
先來實現(xiàn)第一個功能:可以正常滑動輪播圖。
可以設(shè)一個全局變量: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); }
重新編譯運行,可以正常滑動輪播圖,但是當輪播圖在第一張時,不能滑到側(cè)滑菜單。
現(xiàn)在來做第二個功能:當輪播圖在第一張時,可以滑到側(cè)滑菜單。
這里有兩個地方要注意:1.當輪播圖在第一張時;2.由于我的側(cè)滑菜單是在左邊,需要手指向右滑動進入側(cè)滑菜單,所以,第二個條件,應該是右滑。
在以上的基礎(chǔ)上,修改自定義ViewPager代碼
public boolean dispatchTouchEvent(MotionEvent ev) { //在觸發(fā)時回去到起始坐標 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實現(xiàn)頂部導航菜單左右滑動效果
- Android滑動優(yōu)化高仿QQ6.0側(cè)滑菜單(滑動優(yōu)化)
- Android仿微信滑動彈出編輯、刪除菜單效果、增加下拉刷新功能
- Android實現(xiàn)自定義滑動式抽屜菜單效果
- Android仿QQ滑動彈出菜單標記已讀、未讀消息
- android RecyclerView側(cè)滑菜單,滑動刪除,長按拖拽,下拉刷新上拉加載
- Android程序開發(fā)之使用Design包實現(xiàn)QQ動畫側(cè)滑效果和滑動菜單導航
- Android模仿美團頂部的滑動菜單實例代碼
- Android解決viewpager嵌套滑動沖突并保留側(cè)滑菜單功能
- Android實現(xiàn)上下菜單雙向滑動效果
相關(guān)文章
Kotlin語言使用BroadcastReceiver示例介紹
Android開發(fā)的四大組件分別是:活動(activity),用于表現(xiàn)功能;服務(wù)(service),后臺運行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個應用中存儲和讀取數(shù)據(jù),相當于數(shù)據(jù)庫,本篇著重介紹廣播組件2022-09-09Android Bluetooth藍牙技術(shù)使用流程詳解
這篇文章主要介紹了Android Bluetooth藍牙技術(shù)使用流程詳解的相關(guān)資料,需要的朋友可以參考下2016-02-02Kotlin中標準函數(shù)run、with、let、also與apply的使用和區(qū)別詳解
相比Java, Kotlin提供了不少高級語法特性。對于一個Kotlin的初學者來說經(jīng)常會寫出一些不夠優(yōu)雅的代碼,下面這篇文章主要給大家介紹了關(guān)于Kotlin中標準函數(shù)run、with、let、also與apply的使用和區(qū)別的相關(guān)資料,需要的朋友可以參考下。2018-03-03