0

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

1 に答える 1

0

まあ、これは予想よりも簡単でした。最初の2つのパラメーターは、実際にはフリングが開始した場所と終了した場所に関する情報を提供するため、それに基づいて距離変数を見つけることができます。

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 に答える