Android中的平滑滚动

时间:2011-02-09 22:12:53

标签: android scroll

市场上有一款名为Floating images的应用程序。这个应用程序具有最流畅的滚动逻辑之一。基本上,应用程序有一个覆盖整个屏幕的空白画布,然后在空白画布的顶部显示一些图像。用户可以滑动,应用程序可以在滑动方向上移动图像。此外,它也进行动力学滚动。此外,没有滚动条,因此开发人员似乎创建了一个实现所有平滑滚动逻辑的自定义视图。

如果我能得到它的来源那将是很棒的..但是任何人都有关于如何实现这种功能的任何伪代码或逻辑。任何线索,网站链接都会有所帮助。

2 个答案:

答案 0 :(得分:64)

我没有使用OpenGL或加速计的经验,但是滑动(在Android的API中称为 fling )并不难实现。在制作此类自定义View时,您首先需要实现GestureDetector,并在视图onTouchEvent()

中调用其onTouchEvent()
GestureDetector mGD = new GestureDetector(getContext(),
                                        new SimpleOnGestureListener() {

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {
        // beware, it can scroll to infinity
        scrollBy((int)distanceX, (int)distanceY);
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY) {
        mScroller.fling(getScrollX(), getScrollY(),
                -(int)vX, -(int)vY, 0, (int)mMaxScrollX, 0, (int)mMaxScrollY);
        invalidate(); // don't remember if it's needed
        return true;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        if(!mScroller.isFinished() ) { // is flinging
            mScroller.forceFinished(true); // to stop flinging on touch
        }
        return true; // else won't work
    }
});

@Override
public boolean onTouchEvent(MotionEvent event) {
    return mGD.onTouchEvent(event);
}

虽然OnGestureListener.onScroll()直接调用View.scrollBy(),但对于onFling()方法,您需要Scroller

Scroller是一个简单的对象,正如参考文献所述,它封装了滚动。它可用于连续滚动或对晃动作出反应。 Scroller.fling()开始在其内部进行滚动滚动的“模拟”,通过观察它,您可以使用连续重绘动画来复制其平滑度:

@Override
protected void onDraw(Canvas canvas) {
    // ....your drawings....

    // scrollTo invalidates, so until animation won't finish it will be called
    // (used after a Scroller.fling() )
    if(mScroller.computeScrollOffset()) {
        scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    }
}

也就是说,在动画运行之前,计算我们到达的点并滚动到那里。

作为最后一点:请记住在true中返回OnGestureListener.onDown(),即使您不想做任何事情,也不会有效。

请注意,因为Android 2.2中的Scroller有一个错误,即使它达到你作为参数传递的限制,投掷动画也不会真正结束(但是计算出的偏移会尊重它们,所以它不会实际上是移动)。

答案 1 :(得分:8)

Floating Images应用程序是一个开源项目。 http://code.google.com/p/floatingimage/