平滑滚动,具有惯性和边缘阻力/回弹

我通过触摸拖动和多点触控缩放实现了基本滚动以获得自定义视图。 这很好用,但现在我想添加一些高级function。

例如,在Google地图应用程序中,当您在屏幕上拖动时,停止拖动后它仍会继续移动一点(惯性)。 某些浏览器(例如IPad Safari)允许您将屏幕拖动到比网站的可见区域更远的位置,但屏幕将快速快速回到网站的边缘。

我现在想要实现类似的东西,但为了做到这一点,我需要在定期间隔发生触摸事件更改活动屏幕区域以执行动画。 我怎样才能做到这一点?

使用OnGestureListener 。 要提供平滑滚动,请创建一个滚动条(在自定义视图中)。 当手势监听器检测到fling事件时,请将卷轴设置为向上。 然后,覆盖自定义视图的computeScroll()方法。

查看此示例以了解如何实现它。

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

使用Scroller类,我在这里发布了一个使用示例。

如果您使用的是API 9,我认为您可以使用OverScroller 。