Java 具有惯性和边缘阻力/快速恢复的平滑滚动
我通过触摸拖动和多点触摸缩放实现了自定义视图的基本滚动。这很好,但现在我想添加一些高级功能 例如,在谷歌地图应用程序中,当您在屏幕上拖动时,停止拖动后,屏幕仍会继续移动一点(惯性)。一些浏览器(如IPad Safari)允许你将屏幕拖到网站可见区域以外的地方,但随后屏幕会迅速回到网站边缘 我现在想实现类似的功能,但要做到这一点,我需要在定期发生触摸事件后更改活动屏幕区域以执行动画。我该怎么做呢?使用这个类,我发布了一个使用示例 如果您使用的是API 9,我想您可以使用。要提供平滑滚动,请创建一个滚动条(在自定义视图中)。当手势侦听器检测到投掷事件时,设置滚动条。然后,重写自定义视图的computeScroll()方法 检查此示例以了解如何实现它Java 具有惯性和边缘阻力/快速恢复的平滑滚动,java,android,touch,Java,Android,Touch,我通过触摸拖动和多点触摸缩放实现了自定义视图的基本滚动。这很好,但现在我想添加一些高级功能 例如,在谷歌地图应用程序中,当您在屏幕上拖动时,停止拖动后,屏幕仍会继续移动一点(惯性)。一些浏览器(如IPad Safari)允许你将屏幕拖到网站可见区域以外的地方,但随后屏幕会迅速回到网站边缘 我现在想实现类似的功能,但要做到这一点,我需要在定期发生触摸事件后更改活动屏幕区域以执行动画。我该怎么做呢?使用这个类,我发布了一个使用示例 如果您使用的是API 9,我想您可以使用。要提供平滑滚动,请创建一个
int lastX;
int lastY;
Scroller scroller;
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
if (!scrolledLastFrame) {
lastX = scroller.getStartX();
lastY = scroller.getStartY();
}
int dx = scroller.getCurrX() - lastX;
int dy = scroller.getCurrY() - lastY;
lastX = scroller.getCurrX();
lastY = scroller.getCurrY();
doScroll(dx, dy);
scrolledLastFrame = true;
} else {
scrolledLastFrame = false;
}
}
public void doFling(int startX, int startY, int velocityX, int velocityY,
int minX, int maxX, int minY, int maxY) {
scroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
invalidate();
}
public void doScroll(int dx, int dy) {
currentX+=dx;
currentY+=dy;
invalidate();
}
private class ProgramGestureListener extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
doScroll(distanceX, distanceY);
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int max_left = getMaxHorizontalScroll();
int max_top = getMaxVerticalScroll();
int min_left = getMinHorizontalScroll();
int min_top = getMinVerticalScroll();
int startX = getCurrentHorizontalScroll();
int startY = getCurrentVerticalScroll();
doFling(startX, startY, (int) -velocityX, (int) -velocityY,
min_left, max_left, min_top, max_top);
return true;
}
}
我不知道computeScroll(),这比像我一样在onDraw()中使用ComputeScrolOffset()要好得多+谢谢!我试图根据您的答案实现一个解决方案,但由于某种原因,没有调用我的computeScroll()。我必须以某种方式连接Scroller和View吗?要使用GestureListener,还需要使用GestureDetector。向探测器发送触摸事件,并将ProgramGestureListener设置为探测器的侦听器。也许有用: