【发布时间】: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()的distanceX和distanceY参数? -
@AndriyOmelchenko distanceX 和 distanceY 也给出了相似的随机值,并且 distanceX 和 distanceY 给出了 X 和 Y 的总滚动不会在方向改变时重置值。