在gestureDetector onScroll()方法上随机滚动行为

时间:2017-02-01 12:14:44

标签: android gesturedetector

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

我的触控听众:

upSlide.setOnTouchListener(bottomTouchListener);

GestureDetector:

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);
    }
};

GestureDetector:

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的值在滚动上波动,那么我的视图也会闪烁。我不明白这种行为。有人可以解释为什么motionEvent e2是随机和解决方案??? 当我从上到下滚动时它正在工作,但是当我从下到上滚动时,它不工作。

1 个答案:

答案 0 :(得分:0)

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

如果您查看onScroll文档,它会说distanceY是从现在到上次调用onScroll的时间差。根据您的情况,上次调用onScroll是在状态栏消失之前。

因此,行为不是您建议的“随机”,而是连续的切换。