0

想象一个网格(使用画布实现)在右侧和底部是无限的,但在左侧和顶部有边界。我希望能够使用投掷手势滚动这个网格。我使用下面的GestureDetectorScroller类实现了这一点。虽然这在大多数情况下是可以接受的并且看起来不错,但在进行强力甩动时,滚动的距离和速度相当短/慢。

这在做一个不太强大的投掷时很好,例如当你只想滚动你的联系人列表或浏览器时会这样做。但是,对于会大量滚动您的联系人列表的投掷,此方法仅比前一种方法滚动我的网格多一点。

我不确定要设置什么minX/maxX/minY/maxY参数才能达到这些效果,或者还有什么要改变的。到目前为止,我选择的值对于我的目的来说是一个很好的折衷方案:它永远不会滚动太多或太快,但它确实滚动太少和太慢而无法进行强烈的投掷。

如何在我的无限网格中实现与联系人列表类似的投掷行为(我正在考虑 ICS / JB,但我认为它们在这方面的行为大致相同)和浏览器?

相关代码清单:

private int mFlingPrevX, mFlingPrevY;
private void moveSurface() {
    if (mFlinger.computeScrollOffset()) {

        mScroll.x = -mFlinger.getCurrX() + mFlingPrevX;
        mScroll.y = -mFlinger.getCurrY() + mFlingPrevY;

        mFlingPrevX = mFlinger.getCurrX();
        mFlingPrevY = mFlinger.getCurrY();

        invalidate();

        post(new Runnable() {
            @Override
            public void run() {
                moveSurface();
            }
        });
    }
}

@Override
public boolean onFling(final MotionEvent motionEvent1, final MotionEvent motionEvent2, final float velocityX, final float velocityY) {

    ViewConfiguration config = ViewConfiguration.get(mContext);
    if (Math.abs(velocityX) < config.getScaledMinimumFlingVelocity() || Math.abs(velocityY) < config.getScaledMinimumFlingVelocity()) {
        return true;
    }

    mFlinger = new Scroller(mContext);

    mFlingPrevX = getScrollX();
    mFlingPrevY = getScrollY();

    // 380 is a magic number that works OK, but it doesn't do what I'm asking here
    int distance = (int)(GameGlobals.getScreenDensityFactor(mContext) * 380); 
    mFlinger.fling(mFlingPrevX, mFlingPrevY, -(int)velocityX, -(int)velocityY, -distance, distance, -distance, distance);

    post(new Runnable() {
        @Override
        public void run() {
            moveSurface();
        }
    });

    return true;
}
4

1 回答 1

0

嗯,这比预期的要容易。前两个参数实际上提供了有关投掷开始位置和结束位置的信息,因此我们可以根据它找到距离变量。

float dx = motionEvent1.getRawX() - motionEvent2.getRawX();
float dy = motionEvent1.getRawY() - motionEvent2.getRawY();
int distance = 3 * (int)Math.sqrt(dx * dx + dy * dy);
mFlinger.fling(mFlingPrevX, mFlingPrevY, -(int)velocityX, -(int)velocityY, 
               -distance, distance, -distance, distance);

到目前为止,我最喜欢这个,但显然它可以更改为您喜欢的任何内容。

于 2012-10-17T19:34:45.300 回答