在使用SwipeRefreshLayout時我們注意到在SwipeRefreshLayout中左右滑動時可能也會觸發下拉刷新的事件,這點讓我們很不爽。追其原因是SwipeRefreshLayout對於y軸觸摸舉例十分明感,沒有做太多的容差處理(似乎容差值僅有16),所以如果你不是完全水平的滑動的話就很可能會觸發下拉刷新的事件。為了解決這個問題,我們重寫了SwipeRefreshLayout的觸摸事件,當觸摸的X距離大於某個數值的時候,我們就讓它認為我們是在左右滑動,不執行下拉刷新操作。
VerticalSwipeRefreshLayout
package kale.com.waterfall.extra.swiprefreshlayout; import android.content.Context; import android.support.v4.widget.SwipeRefreshLayout; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewConfiguration; /** * @author Jack Tony * @brief 只在豎直方向才能下拉刷新的控件 * @date 2015/4/5 */ public class VerticalSwipeRefreshLayout extends SwipeRefreshLayout { private int mTouchSlop; // 上一次觸摸時的X坐標 private float mPrevX; public VerticalSwipeRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); // 觸發移動事件的最短距離,如果小於這個距離就不觸發移動控件 mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mPrevX = event.getX(); break; case MotionEvent.ACTION_MOVE: final float eventX = event.getX(); float xDiff = Math.abs(eventX - mPrevX); // Log.d("refresh" ,"move----" + eventX + " " + mPrevX + " " + mTouchSlop); // 增加60的容差,讓下拉刷新在豎直滑動時就可以觸發 if (xDiff > mTouchSlop + 60) { return false; } } return super.onInterceptTouchEvent(event); } }