Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中RecyclerView嵌套滑動沖突解決的代碼片段

Android中RecyclerView嵌套滑動沖突解決的代碼片段

編輯:關於Android編程

在縱向RecyclerView嵌套橫向RecyclerView時,如果縱向RecyclerView有下拉刷新功能,那麼內部的橫向RecyclerView的橫向滑動體驗會很差.(只有純橫向滑動時,才能滑動內部的橫向RecyclerView,否則滑動事件就會影響到下拉刷新),添加攔截判斷.

public class MySwipeRefreshLayout extends SwipeRefreshLayout {

  private boolean mIsVpDragger;
  private final int mTouchSlop;
  private float startY;
  private float startX;

  public MySwipeRefreshLayout(Context context) {
    super(context);
    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  }

  public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  }


  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
    int action = ev.getAction();
    switch (action) {
      case MotionEvent.ACTION_DOWN:
        // 記錄手指按下的位置
        startY = ev.getY();
        startX = ev.getX();
        // 初始化標記
        mIsVpDragger = false;
        break;
      case MotionEvent.ACTION_MOVE:
        // 如果viewpager正在拖拽中,那麼不攔截它的事件,直接return false;
        if (mIsVpDragger) {
          return false;
        }

        // 獲取當前手指位置
        float endY = ev.getY();
        float endX = ev.getX();
        float distanceX = Math.abs(endX - startX);
        float distanceY = Math.abs(endY - startY);
        // 如果X軸位移大於Y軸位移,那麼將事件交給viewPager處理。
        if (distanceX > mTouchSlop && distanceX > distanceY) {
          mIsVpDragger = true;
          return false;
        }
        break;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_CANCEL:
        // 初始化標記
        mIsVpDragger = false;
        break;
    }
    // 如果是Y軸位移大於X軸,事件交給swipeRefreshLayout處理。
    return super.onInterceptTouchEvent(ev);
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved