我有一个布局,其中我使用了ScrollView
。
现在我还实现了' CustomScrollView'这样我就可以过滤滑动查看的操作。
这是我的自定义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次。
我可以提供一些建议,以便我可以实施更准确的滑动行为。?
感谢。!!
答案 0 :(得分:1)
也许onFling()
未被调用的问题在于CustomScrollView
有时也拦截水平手势/滚动?
我会尝试使用这个小类,这是为了更好地过滤掉水平手势,然后连接你的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);
}
}
组合滚动视图和手势可能是一项艰巨的任务,需要对特定案例进行多次调整和调整。我非常肯定在过滤部分(因为它已在生产环境中进行过测试和测试),对手势检测器所在的部分不太确定,这需要进行测试。