【问题标题】:How to scroller scroll smoothly?如何平滑滚动?
【发布时间】:2012-01-13 10:33:07
【问题描述】:

我的问题是当我使用滚动条并在其上绘制画布时。它会平滑滚动,但是当我绘制位图 + 画布时,滚动条滚动很慢意味着滚动很重,这就是它滚动很慢的原因。

如何解决这个问题?

【问题讨论】:

标签: java android


【解决方案1】:

我没有使用OpenGL 和加速度计的经验,但是滑动(在 Android 的 API 中称为 fling)并不难实现。制作这样一个自定义视图时,您需要做的第一件事是实现 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 有一个错误,即使它达到了您作为参数传递的限制(但计算的偏移量尊重它们,所以它实际上不会移动),即使它达到作为参数传递的限制,它也不会真正结束)。

【讨论】:

  • 嗨,迈克,感谢您的回复。这个概念在我绘制图像 + 画布(位图)时仅绘制画布时工作正常,因为它很重。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多