【问题标题】:Random scroll behavour on gestureDetector onScroll() method手势检测器 onScroll() 方法上的随机滚动行为
【发布时间】:2019-12-13 08:33:19
【问题描述】:

我正在应用程序中实现滚动面板,用户从顶部滚动隐藏容器,就像 Android 的状态栏通知面板一样。当我从上到下滚动时它工作正常,但是当我从下到上滚动时 MotionEvent e2给出随机值。这是我所做的:

我的触摸监听器:

upSlide.setOnTouchListener(bottomTouchListener);

手势检测器:

GestureDetector bottomGestureDetector = new GestureDetector(
        context, new BottomTouchGestureListener());

//touch listener
OnTouchListener bottomTouchListener = new OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                animateView(sliderView.getTop(), -screenHeight);
            return true;
        }
        return bottomGestureDetector.onTouchEvent(motionEvent);
    }
};

手势检测器:

class BottomTouchGestureListener extends GestureDetector.SimpleOnGestureListener {

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return super.onFling(e1, e2, velocityX, velocityY);
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        if (e2.getAction() == MotionEvent.ACTION_MOVE) {
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    //left right swipe
                } else {
                    //top down swipe
                    slideOffset = Math.abs((int) diffY);
                    Log.e(TAG, "onScroll -->" + e2.getY() + "");
                    invalidate();
                }
            } catch (Exception exception) {
            }
        }
        return true;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return super.onSingleTapUp(e);
    }
}

我的日志输出是:

onScroll --> 40.83081
onScroll --> 1855.7668
onScroll --> 71.79602
onScroll --> 1843.0444
onScroll --> 50.157593
onScroll --> 1815.4504
onScroll --> 45.553223
onScroll --> 1778.2007
onScroll --> 48.40674
onScroll --> 1751.7765
onScroll --> 44.186157
onScroll --> 1715.3464
onScroll --> 44.40625
onScroll --> 1677.5885
onScroll --> 35.96411
onScroll --> 1624.1068
onScroll --> 22.843506
onScroll --> 1544.1412
onScroll --> 12.907837
onScroll --> 1441.6538
onScroll --> -5.8792725
onScroll --> 1300.1215
onScroll --> -36.662354
onScroll --> 1085.7295
onScroll --> -61.72827
onScroll --> 818.67615
onScroll --> -69.63501
onScroll --> 544.83466

如果您注意到触摸事件 MotionEvent e2 的值在 onScroll 波动,那么我的视图也在闪烁。我不明白这种行为。有人可以解释为什么motionEvent e2 是随机的和解决方案吗??? 当我从上到下滚动时它正在工作,但当我从下到上滚动时它不起作用。

【问题讨论】:

  • 为什么你没有使用onScroll()distanceXdistanceY参数?
  • @AndriyOmelchenko distanceX 和 distanceY 也给出了相似的随机值,并且 distanceX 和 distanceY 给出了 X 和 Y 的总滚动不会在方向改变时重置值。

标签: android gesturedetector


【解决方案1】:

这是因为当您隐藏状态栏(或垂直结构中的任何其他视图)时,垂直滚动坐标会受到影响。

如果您查看onScroll 文档,它会说distanceY 是从现在到最后一次调用onScroll 之间的增量。在您的情况下,最后一次调用 onScroll 是在状态栏消失之前。

所以行为不是你建议的“随机”,而是连续切换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多