想象一个网格(使用画布实现)在右侧和底部是无限的,但在左侧和顶部有边界。我希望能够使用投掷手势滚动这个网格。我使用下面的GestureDetector
和Scroller
类实现了这一点。虽然这在大多数情况下是可以接受的并且看起来不错,但在进行强力甩动时,滚动的距离和速度相当短/慢。
这在做一个不太强大的投掷时很好,例如当你只想滚动你的联系人列表或浏览器时会这样做。但是,对于会大量滚动您的联系人列表的投掷,此方法仅比前一种方法滚动我的网格多一点。
我不确定要设置什么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;
}