你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 解決LRecyclerView側滑iOS阻塞效果不完整問題

解決LRecyclerView側滑iOS阻塞效果不完整問題

編輯:IOS開發綜合

最近項目中用到下拉刷新與側滑刪除需要同時實現的情形, 所以對LRecyclerView進行了一些了解, 在測試側滑功能時, 發現iOS阻塞效果不完整, 即當條目處於側滑狀態時, 點擊該條目的非側滑位置時無法自動關閉, 於是對LRecyclerView項目中的自定義SwipeMenuView進行了分析, 發現在dispatchTouchEvent的down事件中進行了如下的條件判斷:

if (mViewCache != this) {
     mViewCache.smoothClose();
     mViewCache = null;
     iosInterceptFlag = isIos;//add by 2016 09 11 ,IOS模式開啟的話,且當前有側滑菜單的View,且不是自己的,就該攔截事件咯。
}

這樣的判斷導致阻塞效果無法在被側滑的條目上實現, 所以我加上了如下的條件判斷:

//如果是自己, 當按下的位置在內容的范圍, 關閉側滑菜單, 否則不攔截
if (ev.getRawX() < mScreenW - mRightMenuWidths) {
     mViewCache.smoothClose();
     mViewCache = null;
     iosInterceptFlag = isIos;
}

最後,SwipeMenuView中完整的dispatchTouchEvent的down事件如下:
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;
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved