Android滑動(dòng)事件沖突詳解(一)
首先,我們假設(shè)這樣一個(gè)場(chǎng)景:一個(gè)ViewPager里面嵌套一個(gè)ViewPager,內(nèi)部滑動(dòng)方向和外部滑動(dòng)方向一樣時(shí),該怎么解決這一沖突呢?
針對(duì)滑動(dòng)沖突這里給出兩種解決方案:外部攔截法,內(nèi)部攔截法。
外部攔截法
外部攔截法是指點(diǎn)擊事件都先經(jīng)過(guò)父容器的攔截處理,如果父容器需要此攔截事件,就攔截,不需要就不攔截,這種方法比較符合點(diǎn)擊事件的分發(fā)機(jī)制。這種方法代碼如下:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { ... boolean intercepted=false; switch (action) { case MotionEvent.ACTION_MOVE: intercepted=false; break; case MotionEvent.ACTION_MOVE: if(父容器需要處理此事件) intercepted=true; else intercepted=false; break; case MotionEvent.ACTION_UP: { intercepted=false; break; } ... return intercepted; }
上述代碼是外部攔截的典型邏輯,只需要重寫(xiě)onInterceptTouchEvent()方法,修改父容器當(dāng)前需要的事件即可。
內(nèi)部攔截法
內(nèi)部攔截法是指:父容器不攔截任何事件,所有事件都傳遞給子元素,如果子元素需要此事件就直接消耗掉,否則就交由父容器處理。這種方法與Android中的事件分發(fā)機(jī)制不一致,需要配合 requestDisallowInterceptTouchEvent()方法才能正常工作。我們需要重寫(xiě)子元素的,代碼如下:
public boolean dispatchTouchEvent(MotionEvent event) { ... switch (action) { case MotionEvent.ACTION_MOVE: getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: if(子元素需要處理此事件) getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: { break; } ... return super.dispatchTouchEvent(event); ; }
當(dāng)然,還需要修改父容器的onInterceptTouchEvent()方法,代碼如下:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action=ev.getAction(); if(action==MotionEvent.ACTION_DOWN){ return false; }else { return true; } }
更多關(guān)于滑動(dòng)功能的文章,請(qǐng)點(diǎn)擊專題: 《Android滑動(dòng)功能》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺談Android View滑動(dòng)沖突的解決方法
- android多種滑動(dòng)沖突的解決方案
- Android下拉刷新與輪播圖滑動(dòng)沖突解決方案
- Android滑動(dòng)沖突的完美解決
- 淺談Android實(shí)踐之ScrollView中滑動(dòng)沖突處理解決方案
- Android中RecyclerView嵌套滑動(dòng)沖突解決的代碼片段
- android中view手勢(shì)滑動(dòng)沖突的解決方法
- Android滑動(dòng)沖突的完美解決方案
- Android App中ViewPager所帶來(lái)的滑動(dòng)沖突問(wèn)題解決方法
- Android滑動(dòng)沖突問(wèn)題的解決方法
相關(guān)文章
Android自定義可左右滑動(dòng)和點(diǎn)擊的折線圖
這篇文章主要為大家詳細(xì)介紹了Android自定義可左右滑動(dòng)和點(diǎn)擊的折線圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Android 1.5 1.6 2.0 2.1 2.2 的區(qū)別詳解
本篇文章是對(duì)Android 1.5 1.6 2.0 2.1 2.2 版本之間的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Android 使用Vibrator服務(wù)實(shí)現(xiàn)點(diǎn)擊按鈕帶有震動(dòng)效果
這篇文章主要介紹了Android 使用Vibrator服務(wù)實(shí)現(xiàn)點(diǎn)擊按鈕帶有震動(dòng)效果,,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)火鍋工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Android中Textview超鏈接實(shí)現(xiàn)方式
TextView中的超鏈接可以通過(guò)幾種方式實(shí)現(xiàn):1.Html.fromHtml,2.Spannable,3.Linkify.addLinks。下面分別進(jìn)行測(cè)試,包括修改字體樣式,下劃線樣式,點(diǎn)擊事件等,需要的朋友可以參考下2016-02-02Jetpack Compose 雙指拖拽實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Jetpack Compose 雙指拖拽實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Android編程操作嵌入式關(guān)系型SQLite數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了Android編程操作嵌入式關(guān)系型SQLite數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android操作SQLite數(shù)據(jù)庫(kù)的基本技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-01-01Android Compose自定義TextField實(shí)現(xiàn)自定義的輸入框
眾所周知Compose中默認(rèn)的TextField和OutlineTextField樣式并不能滿足所有的使用場(chǎng)景,所以自定義TextField就成了必備技能。本文將自定義TextField實(shí)現(xiàn)自定義的輸入框,感興趣的可以了解一下2022-03-03Android編程中activity啟動(dòng)時(shí)出現(xiàn)白屏、黑屏問(wèn)題的解決方法
這篇文章主要介紹了Android編程中activity啟動(dòng)時(shí)出現(xiàn)白屏、黑屏問(wèn)題的解決方法,涉及Android針對(duì)activity啟動(dòng)設(shè)置的技巧,需要的朋友可以參考下2015-12-12