今天就跟大家聊聊有關(guān)Android應(yīng)用中出現(xiàn)滑動(dòng)沖突如何解決,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)樂(lè)昌,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):13518219792場(chǎng)景一:類(lèi)似于ViewPager嵌套Fragmnet并且在Fragmnet中嵌套了一個(gè)ListView的效果,可以通過(guò)左右滑動(dòng)來(lái)切換或者觸發(fā)其他view的顯示。但是在ViewPager內(nèi)部已經(jīng)處理了這個(gè)沖突,所以我們會(huì)發(fā)現(xiàn)ViewPager嵌套Fragmnet的時(shí)候很是流暢。如果我們采用的不是ViewPager而是ScrollView,那么就需要我們主動(dòng)去處理這個(gè)沖突了;
場(chǎng)景二:這種情況比較復(fù)雜,那就是view和被嵌套的view需要在同一個(gè)方向上滑動(dòng),這時(shí)候,用戶(hù)滑動(dòng)view的時(shí)候,系統(tǒng)就不知道用戶(hù)想要滑動(dòng)的view是哪一個(gè),問(wèn)題就不由自主的跳出來(lái)了;
場(chǎng)景三:場(chǎng)景三是最為復(fù)雜的一種,即有場(chǎng)景一的情況,也有場(chǎng)景二的情況,兩種情況的疊加,所以需要處理內(nèi)部和中部、中部和和外部的沖突。
問(wèn)題已經(jīng)出來(lái)了,那我們?cè)趺唇鉀Q呢?
view既然可以滑動(dòng),那么就有滑動(dòng)的規(guī)律,一般來(lái)說(shuō),當(dāng)用戶(hù)滑動(dòng)時(shí),需要讓外部的view攔截點(diǎn)擊事件,當(dāng)用戶(hù)上下滑動(dòng)時(shí),需要讓內(nèi)部view攔截view的點(diǎn)擊事件,這時(shí)候,我們就可以根據(jù)是上下還是左右滑動(dòng)來(lái)具體處理沖突事件。對(duì)于場(chǎng)景二和場(chǎng)景三,大致的想法也是差不多的,修改相關(guān)的滑動(dòng)規(guī)則就OK了。
1、外部攔截:
所謂的外部攔截是指點(diǎn)擊事件都先經(jīng)過(guò)父容器的攔截處理,如果有需要就去攔截,否則不攔截,這樣就可以簡(jiǎn)單的處理場(chǎng)景一的問(wèn)題了。
public boolean onInterceptTouchEvent(MotionEvent event){ boolean intercepted=false; int x=(int)event.getX(); int y=(int)event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: if(父容器需要當(dāng)前點(diǎn)擊事件){ intercepted=true; }else{ intercepted=false; } break; case MotionEvent.ACTION_UP: intercepted=false; break; default: break; } mLastXIntercepted=x; mLastYIntercepted=y; return intercepted; }