【问题标题】:Smooth scrolling in AndroidAndroid中的平滑滚动
【发布时间】:2011-06-24 11:33:52
【问题描述】:

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

如果我能得到它的来源,那就太棒了。但任何人都有关于如何实现这种功能的任何伪代码或逻辑。任何潜在客户、网站链接都会有所帮助。

【问题讨论】:

    标签: android scroll


    【解决方案1】:

    我没有使用 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());
        }
    }
    

    也就是说,直到动画开始运行,计算我们到达的点并滚动到那里。

    最后一点:记得在你的OnGestureListener.onDown() 中返回true,即使你不想做任何事情,否则它不会起作用。

    并且要小心,因为 Android 2.2 中的 Scroller 有一个错误,即使它达到了您作为参数传递的限制(但计算出的偏移量尊重它们,所以它实际上不会移动) )。

    【讨论】:

    • 感谢大石头。看起来我必须阅读更多内容才能理解您的示例并使我的代码正常工作。非常感谢您为提供代码 sn-p 和解释所做的努力。
    • 对初学者来说很好的解释兄弟,但你能告诉我这里的 mScroller 是什么吗?我的意思是它在哪里初始化?
    • @user1201239 你可以在构造函数中初始化它。
    • @user1201239,不,是Scroller mScroller = new Scroller(this);
    • 这里有一个完整的例子:developer.android.com/training/custom-views/…
    【解决方案2】:

    浮动图像应用是一个开源项目。 http://code.google.com/p/floatingimage/

    【讨论】:

    • @rallat :它与 Android 无关。
    • @Shubh 这与 Android 非常相关。他提供了一个名为“floatingimage”的开源 Android 项目的链接,该应用程序的描述为“在您的 android 手机上显示图像流”
    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 2011-01-05
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多