左右に無限であるが、左右に境界があるグリッド(キャンバスを使用して実装)を想像してみてください。フリングジェスチャを使用してこのグリッドをスクロールできるようにしたい。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;
}