Android側(cè)滑菜單和輪播圖之滑動(dòng)沖突問(wèn)題
接手一個(gè)項(xiàng)目,有一個(gè)問(wèn)題需要修改:輪播圖不能手動(dòng)滑動(dòng),手動(dòng)滑動(dòng)輪播圖只會(huì)觸發(fā)側(cè)滑菜單。
猜測(cè):viewpager控件(輪播圖)的觸摸事件被SlidingMenu控件(側(cè)滑菜單,非第三方項(xiàng)目,乃是上個(gè)開(kāi)發(fā)人員自定義的)攔截了。
基于這個(gè)猜測(cè),我自定義一個(gè)ViewPager,重寫(xiě)dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,分別在這三個(gè)方法中打印log;
重寫(xiě)SlidingMenu的dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,同樣打印log。
重新編譯運(yùn)行,手滑輪播圖,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中可以看出,該開(kāi)始,還能將滑動(dòng)事件傳遞給ViewPager,之后,就被SlidingMenu攔截了。這個(gè)log證實(shí)了這個(gè)猜想是正確的。
知道了原因就好解決了,我現(xiàn)在要考慮的是:要達(dá)到什么樣的效果。
預(yù)期效果:可以正?;瑒?dòng)輪播圖,當(dāng)輪播圖在第一張時(shí),可以滑到側(cè)滑菜單。
網(wǎng)上有人分享過(guò)類似的問(wèn)題。我這里也借鑒了一下。
先來(lái)實(shí)現(xiàn)第一個(gè)功能:可以正?;瑒?dòng)輪播圖。
可以設(shè)一個(gè)全局變量:public static boolean mRollViewPagerTouching;
用來(lái)表示是否在觸摸輪播圖。
在自定義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);
}
重新編譯運(yùn)行,可以正?;瑒?dòng)輪播圖,但是當(dāng)輪播圖在第一張時(shí),不能滑到側(cè)滑菜單。
現(xiàn)在來(lái)做第二個(gè)功能:當(dāng)輪播圖在第一張時(shí),可以滑到側(cè)滑菜單。
這里有兩個(gè)地方要注意:1.當(dāng)輪播圖在第一張時(shí);2.由于我的側(cè)滑菜單是在左邊,需要手指向右滑動(dòng)進(jìn)入側(cè)滑菜單,所以,第二個(gè)條件,應(yīng)該是右滑。
在以上的基礎(chǔ)上,修改自定義ViewPager代碼
public boolean dispatchTouchEvent(MotionEvent ev) {
//在觸發(fā)時(shí)回去到起始坐標(biāo)
float x = ev.getX();
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
//獲取到距離差
float dx = x - downX;
//防止是按下也判斷
if (Math.abs(dx) > 8) {
//通過(guò)距離差判斷方向
if (dx > 0) {
// "右";
if (getCurrentItem() == 0) {
MyApplication.mRollViewPagerTouching = false;
} else {
MyApplication.mRollViewPagerTouching = true;
}
} else {
// "左";
MyApplication.mRollViewPagerTouching = true;
}
}
break;
case MotionEvent.ACTION_DOWN:
//將按下時(shí)的坐標(biāo)存儲(chǔ)
downX = x;
MyApplication.mRollViewPagerTouching = true;
break;
case MotionEvent.ACTION_UP:
MyApplication.mRollViewPagerTouching = false;
break;
}
return super.dispatchTouchEvent(ev);
}
再次編譯運(yùn)行,成功達(dá)到預(yù)期效果。
- Android實(shí)現(xiàn)頂部導(dǎo)航菜單左右滑動(dòng)效果
- Android滑動(dòng)優(yōu)化高仿QQ6.0側(cè)滑菜單(滑動(dòng)優(yōu)化)
- Android仿微信滑動(dòng)彈出編輯、刪除菜單效果、增加下拉刷新功能
- Android實(shí)現(xiàn)自定義滑動(dòng)式抽屜菜單效果
- Android仿QQ滑動(dòng)彈出菜單標(biāo)記已讀、未讀消息
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長(zhǎng)按拖拽,下拉刷新上拉加載
- Android程序開(kāi)發(fā)之使用Design包實(shí)現(xiàn)QQ動(dòng)畫(huà)側(cè)滑效果和滑動(dòng)菜單導(dǎo)航
- Android模仿美團(tuán)頂部的滑動(dòng)菜單實(shí)例代碼
- Android解決viewpager嵌套滑動(dòng)沖突并保留側(cè)滑菜單功能
- Android實(shí)現(xiàn)上下菜單雙向滑動(dòng)效果
相關(guān)文章
android開(kāi)機(jī)自啟動(dòng)原理與實(shí)現(xiàn)案例(附源碼)
完成一下步驟后,啟動(dòng)一次程序,完成注冊(cè)。等下次手機(jī)開(kāi)機(jī)時(shí),該軟件即會(huì)自動(dòng)啟動(dòng),具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06
移動(dòng)端html5圖片上傳方法【更好的兼容安卓IOS和微信】
這篇文章主要為大家詳細(xì)介紹了移動(dòng)端html5圖片上傳方法,更好的兼容安卓IOS和微信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
android實(shí)現(xiàn)主動(dòng)連接和被動(dòng)連接的藍(lán)牙聊天功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)主動(dòng)連接和被動(dòng)連接的藍(lán)牙聊天功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android下的POS打印機(jī)調(diào)用的簡(jiǎn)單實(shí)現(xiàn)
本篇文章主要介紹了Android下的POS打印機(jī)調(diào)用的簡(jiǎn)單實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04
從0快速搭建一個(gè)實(shí)用的MVVM框架(超詳細(xì))
這篇文章主要介紹了從0搭建一個(gè)實(shí)用的MVVM框架,結(jié)合Jetpack,構(gòu)建快速開(kāi)發(fā)的MVVM框架,支持快速生成ListActivity、ListFragment,主要是基于MVVM進(jìn)行快速開(kāi)發(fā)上手即用,需要的朋友可以參考下2022-03-03
Android使用GridView實(shí)現(xiàn)橫向滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android使用GridView實(shí)現(xiàn)橫向滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android中TextView和ImageView實(shí)現(xiàn)傾斜效果
這篇文章主要為大家詳細(xì)介紹了Android中TextView和ImageView實(shí)現(xiàn)傾斜效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android 繪制多級(jí)樹(shù)形選擇列表實(shí)例代碼
這篇文章主要介紹了Android 繪制多級(jí)樹(shù)形選擇列表的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
android實(shí)現(xiàn)點(diǎn)擊按鈕控制圖片切換
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)點(diǎn)擊按鈕控制圖片切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01

