在 Scrollview 中滑动并非一直有效
Swipe in Scrollview is not working all time
我使用了一种布局 ScrollView
。
现在我还实现了 'CustomScrollView' 以便我可以过滤 Swipe 视图的操作。
这是我的自定义 ScrollView :
public class CustomScrollView extends ScrollView {
private GestureDetector mGestureDetector;
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, new YScrollDetector());
setFadingEdgeLength(0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
// Return false if we're scrolling in the x direction
class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return Math.abs(distanceY) > Math.abs(distanceX);
}
}
}
现在我也实现了GestureDetector
。
在滑动视图时将调用 onFling
80/100 次。
我可以提出一些建议,以便我可以实施更准确的 滑动 行为吗?
谢谢。!!
也许onFling()
没有被调用的问题在于CustomScrollView
有时也会截取水平gestures/scrolling?
我会尝试使用这个小 class,它可以更好地过滤掉水平手势,然后连接你的 GestureDetector
:
public class CustomScrollView extends ScrollView {
private GestureDetector mGestureDetector;
private float mHorizontalDistance;
private float mVerticalDistance;
private float mPreviousX;
private float mPreviousY;
@Override
public boolean onInterceptTouchEvent(@NonNull MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mHorizontalDistance = mVerticalDistance = 0f;
mPreviousX = ev.getX();
mPreviousY = ev.getY();
mGestureDetector.onTouchEvent(ev);
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
mHorizontalDistance += Math.abs(curX - mPreviousX);
mVerticalDistance += Math.abs(curY - mPreviousY);
mPreviousX = curX;
mPreviousY = curY;
if (mHorizontalDistance > mVerticalDistance) {
mGestureDetector.onTouchEvent(ev);
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}
组合滚动视图和手势可能是一项艰巨的任务,需要针对特定情况进行多次微调和调整。过滤部分我比较确定(因为已经在生产环境试过了),手势检测器进来的部分不太确定,这个需要测试。
我使用了一种布局 ScrollView
。
现在我还实现了 'CustomScrollView' 以便我可以过滤 Swipe 视图的操作。
这是我的自定义 ScrollView :
public class CustomScrollView extends ScrollView {
private GestureDetector mGestureDetector;
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
mGestureDetector = new GestureDetector(context, new YScrollDetector());
setFadingEdgeLength(0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);
}
// Return false if we're scrolling in the x direction
class YScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return Math.abs(distanceY) > Math.abs(distanceX);
}
}
}
现在我也实现了GestureDetector
。
在滑动视图时将调用 onFling
80/100 次。
我可以提出一些建议,以便我可以实施更准确的 滑动 行为吗?
谢谢。!!
也许onFling()
没有被调用的问题在于CustomScrollView
有时也会截取水平gestures/scrolling?
我会尝试使用这个小 class,它可以更好地过滤掉水平手势,然后连接你的 GestureDetector
:
public class CustomScrollView extends ScrollView {
private GestureDetector mGestureDetector;
private float mHorizontalDistance;
private float mVerticalDistance;
private float mPreviousX;
private float mPreviousY;
@Override
public boolean onInterceptTouchEvent(@NonNull MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mHorizontalDistance = mVerticalDistance = 0f;
mPreviousX = ev.getX();
mPreviousY = ev.getY();
mGestureDetector.onTouchEvent(ev);
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
mHorizontalDistance += Math.abs(curX - mPreviousX);
mVerticalDistance += Math.abs(curY - mPreviousY);
mPreviousX = curX;
mPreviousY = curY;
if (mHorizontalDistance > mVerticalDistance) {
mGestureDetector.onTouchEvent(ev);
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
}
组合滚动视图和手势可能是一项艰巨的任务,需要针对特定情况进行多次微调和调整。过滤部分我比较确定(因为已经在生产环境试过了),手势检测器进来的部分不太确定,这个需要测试。