最近項目中用到下拉刷新與側滑刪除需要同時實現的情形, 所以對LRecyclerView進行了一些了解, 在測試側滑功能時, 發現iOS阻塞效果不完整, 即當條目處于側滑狀態時, 點擊該條目的非側滑位置時無法自動關閉, 于是對LRecyclerView項目中的自定義 SwipeMenuView進行了分析, 發現在dispatchTouchEvent的down事件中進行了如下的條件判斷:
1
2
3
4
5
|
if (mViewCache != this ) { mViewCache.smoothClose(); mViewCache = null ; iosInterceptFlag = isIos; //add by 2016 09 11 ,IOS模式開啟的話,且當前有側滑菜單的View,且不是自己的,就該攔截事件咯。 } |
這樣的判斷導致阻塞效果無法在被側滑的條目上實現, 所以我加上了如下的條件判斷:
1
2
3
4
5
6
|
//如果是自己, 當按下的位置在內容的范圍, 關閉側滑菜單, 否則不攔截 if (ev.getRawX() < mScreenW - mRightMenuWidths) { mViewCache.smoothClose(); mViewCache = null ; iosInterceptFlag = isIos; } |
最后, SwipeMenuView中完整的dispatchTouchEvent的down事件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
case MotionEvent.ACTION_DOWN: iosInterceptFlag = false ; //add by 2016 09 11 ,每次DOWN時,默認是不攔截的 if (isTouching) { //如果有別的指頭摸過了,那么就return false。這樣后續的move..等事件也不會再來找這個View了。 return false ; } else { isTouching = true ; //第一個摸的指頭,趕緊改變標志,宣誓主權。 } mLastP.set(ev.getRawX(), ev.getRawY()); //如果down,view和cacheview不一樣,則立馬讓它還原。且把它置為null if (mViewCache != null ) { if (mViewCache != this ) { mViewCache.smoothClose(); mViewCache = null ; iosInterceptFlag = isIos; //add by 2016 09 11 ,IOS模式開啟的話,且當前有側滑菜單的View,且不是自己的,就該攔截事件咯。 } else { //如果是自己, 當按下的位置在內容的范圍, 關閉側滑菜單, 否則不攔截 if (ev.getRawX() < mScreenW - mRightMenuWidths) { mViewCache.smoothClose(); mViewCache = null ; iosInterceptFlag = isIos; } } //只要有一個側滑菜單處于打開狀態, 就不給外層布局上下滑動了 getParent().requestDisallowInterceptTouchEvent( true ); } //求第一個觸點的id, 此時可能有多個觸點,但至少一個,計算滑動速率用 mPointerId = ev.getPointerId( 0 ); break ; |
以上所述是小編給大家介紹的LRecyclerView側滑iOS阻塞效果不完整的解決辦法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://blog.csdn.net/x343320790/article/details/53880169