新聞中心
接手一個(gè)項(xiàng)目,有一個(gè)問(wèn)題需要修改:輪播圖不能手動(dòng)滑動(dòng),手動(dòng)滑動(dòng)輪播圖只會(huì)觸發(fā)側(cè)滑菜單。
創(chuàng)新互聯(lián)建站是一家專(zhuān)注于成都做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),肥城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:肥城等地區(qū)。肥城做網(wǎng)站價(jià)格咨詢(xún):18982081108
猜測(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ò)類(lèi)似的問(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ù)期效果。
分享標(biāo)題:Android側(cè)滑菜單和輪播圖之滑動(dòng)沖突問(wèn)題
本文地址:http://fisionsoft.com.cn/article/ispgec.html