遇到一种情况需要处理,RecyclerView所在Activity需要处理滑动事件用于返回(onBackPressed)。
手势检测:
1 @Override 2 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 3 float velocityY) { 4 LogUtil.d(this,"fling"); 5 if (e1.getX() - e2.getX() > verticalMinDistance 6 && Math.abs(velocityX) > minVelocity) { 7 LogUtil.d(this, "fling left"); 8 return true; 9 } else if (e2.getX() - e1.getX() > verticalMinDistance 10 && Math.abs(velocityX) > minVelocity) { 11 LogUtil.d(this, "fling right"); 12 activity.onBackPressed(); 13 return true; 14 } 15 return false; 16 } 17 18 @Override 19 public boolean onDown(MotionEvent e) { 20 LogUtil.d(this, "Down"); 21 return false; 22 } 23 24 @Override 25 public boolean onScroll(MotionEvent e1, MotionEvent e2, 26 float distanceX, float distanceY) { 27 LogUtil.d(this, "scroll"); 28 return false; 29 }
此处需要注意,onDown不能直接处理成true(开始就坑在这里,完全按普通触摸事件处理成返回true,导致click事件永远不会得到事件触发)。
虽然官方文档建议处理触摸事件时,要将其置成true,表示开始处理触摸。但因为我们还有itemView的click事件要处理,所以onDown不能直接返回true.
绑定触摸事件:
1 view.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { 2 @Override 3 public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 4 LogUtil.d("Base RecyclerView Event", "Touch"); 5 mDetector.onTouchEvent(e); 6 return false; 7 } 8 9 @Override 10 public void onTouchEvent(RecyclerView rv, MotionEvent e) { 11 12 } 13 14 @Override 15 public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 16 17 } 18 });