Android側滑菜單和輪播圖之滑動沖突問題
接手一個項目,有一個問題需要修改:輪播圖不能手動滑動,手動滑動輪播圖只會觸發(fā)側滑菜單。
猜測:viewpager控件(輪播圖)的觸摸事件被SlidingMenu控件(側滑菜單,非第三方項目,乃是上個開發(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)在要考慮的是:要達到什么樣的效果。
預期效果:可以正常滑動輪播圖,當輪播圖在第一張時,可以滑到側滑菜單。
網(wǎng)上有人分享過類似的問題。我這里也借鑒了一下。
先來實現(xiàn)第一個功能:可以正常滑動輪播圖。
可以設一個全局變量: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);
}
重新編譯運行,可以正?;瑒虞啿D,但是當輪播圖在第一張時,不能滑到側滑菜單。
現(xiàn)在來做第二個功能:當輪播圖在第一張時,可以滑到側滑菜單。
這里有兩個地方要注意:1.當輪播圖在第一張時;2.由于我的側滑菜單是在左邊,需要手指向右滑動進入側滑菜單,所以,第二個條件,應該是右滑。
在以上的基礎上,修改自定義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側滑菜單(滑動優(yōu)化)
- Android仿微信滑動彈出編輯、刪除菜單效果、增加下拉刷新功能
- Android實現(xiàn)自定義滑動式抽屜菜單效果
- Android仿QQ滑動彈出菜單標記已讀、未讀消息
- android RecyclerView側滑菜單,滑動刪除,長按拖拽,下拉刷新上拉加載
- Android程序開發(fā)之使用Design包實現(xiàn)QQ動畫側滑效果和滑動菜單導航
- Android模仿美團頂部的滑動菜單實例代碼
- Android解決viewpager嵌套滑動沖突并保留側滑菜單功能
- Android實現(xiàn)上下菜單雙向滑動效果
相關文章
android開機自啟動原理與實現(xiàn)案例(附源碼)
完成一下步驟后,啟動一次程序,完成注冊。等下次手機開機時,該軟件即會自動啟動,具體實現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06
android實現(xiàn)主動連接和被動連接的藍牙聊天功能
這篇文章主要為大家詳細介紹了android實現(xiàn)主動連接和被動連接的藍牙聊天功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06
Android使用GridView實現(xiàn)橫向滾動效果
這篇文章主要為大家詳細介紹了Android使用GridView實現(xiàn)橫向滾動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07
Android中TextView和ImageView實現(xiàn)傾斜效果
這篇文章主要為大家詳細介紹了Android中TextView和ImageView實現(xiàn)傾斜效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

