重写SwipeRefreshLayout下拉刷新,避免在左右滑动时执行下拉刷新操作
2016-09-24 23:09
239 查看
在使用SwipeRefreshLayout时我们注意到在SwipeRefreshLayout中左右滑动时可能也会触发下拉刷新的事件,这点让我们很不爽。追其原因是SwipeRefreshLayout对于y轴触摸举例十分明感,没有做太多的容差处理(似乎容差值仅有16),所以如果你不是完全水平的滑动的话就很可能会触发下拉刷新的事件。为了解决这个问题,我们重写了SwipeRefreshLayout的触摸事件,当触摸的X距离大于某个数值的时候,我们就让它认为我们是在左右滑动,不执行下拉刷新操作。
VerticalSwipeRefreshLayout
VerticalSwipeRefreshLayout
import android.content.Context; import android.support.v4.widget.SwipeRefreshLayout; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ViewConfiguration; /** * @author lishan * @brief 只在竖直方向才能下拉刷新的控件 * @date 2016/8/7 */ 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); } }
相关文章推荐
- C#开发网站如何提高性能--避免不必要的执行操作
- [转载]为UIView添加上下左右滑动操作(切换时)
- Win7系统执行操作后桌面右键刷新反应慢的解决方法
- Android SwipeActionAdapter结合Pinnedheaderlistview实现复杂列表的左右滑动操作
- Android 使用SwipeActionAdapter开源库实现简单列表的左右滑动操作
- 使用XMLHTTP实现[执行操作不刷新页面]
- ASP.NET中防止页面刷新造成表单重复提交执行两次操作
- ios左右滑动页面刷新
- js 我想停顿 几秒 再执行刷新操作 js方法
- ThinkPHP 表单提交操作成功后执行JS操作如何刷新父页面或关闭当前页等操作
- 为UIView添加上下左右滑动操作
- 为UIView添加上下左右滑动操作
- 为UIView添加上下左右滑动操作
- 重写viewgroup实现左右滑动(修改)
- 下拉刷新、上拉获取更多、左右滑动的ListView
- js获取键盘(上下左右)方向键,执行相应操作
- 下拉刷新 左右滑动
- 在后台定时刷新执行某项操作
- android仿新版UC首页,上滑隐藏顶部轮播图,支持单个栏目下拉刷新,左右滑动切换
- ASP.NET中防止页面刷新造成表单重复提交执行两次操作