3

アニメーションでフリングすると次のスライドに移動するギャラリーを実装する必要があります。私はここでいくつかの解決策を見つけました: プログラムでスクロールアニメーションを作成する方法

私はこのコードを使用しています:

//scroll forward or backward
 private void scroll(int type){
View selectedV = mG.getSelectedView();
int idx = mG.indexOfChild(selectedV);
switch(type){
    case FORWARD:
default:
    if(idx<mG.getChildCount()-1)
        idx++;
    break;
case BACKWARD:
    if(idx>0)
        idx--;          
    break;
}
//now scrolled view's child idx in gallery is gotten
View nextView = mG.getChildAt(idx);
//(x,y) in scrolled view is gotten
int x = nextView.getLeft()+nextView.getWidth()/2;
int y = nextView.getTop()+nextView.getHeight()/2;
String out = String.format("x=%d, y=%d", x, y);
Log.i(TAG+".scroll", out);

//Kurru's simulating clicking view
MotionEvent event = MotionEvent.obtain(100, 100, MotionEvent.ACTION_DOWN, x, y, 0);
mG.onDown(event); 
boolean res = mG.onSingleTapUp(null);
Log.i(TAG+".scroll", "onSingleTapUp return =" + res);       

}

問題は、3つの画像が表示されている場合にのみ機能し、一部のデバイスでも機能しないことです。

しかし、一度に1つずつ画像を表示すると(デバイスの幅のほぼすべてを占める)、この方法は機能しません。そのため、次のメソッドを実装しました。

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {

    if(e1 == null || e2 == null) return false;
    if (isScrollingLeft(e1, e2)) { // Check if scrolling left


        if(State.curentZoom==0)
            return super.onFling(e1, e2, State.imgWidthBig*1.1f, 0);
        else {
            scroll(BACKWARD);
            return true;
        }
    } else if (isScrollingRight(e1, e2)) { // Otherwise scrolling right

        if(State.curentZoom==0)
            return super.onFling(e1, e2, (-1)*State.imgWidthBig*1.1f, 0);
        else {
            scroll(FORWARD);
            return true;
        }
    } else
        return false;

}

他の投稿のコードを使用する: ギャラリーウィジェットでスクロールを停止する方法は?

目的:右のvelocityXを計算して、あるスライドから別のスライドへ、左または右にスムーズにスクロールできるようにします。速度はピクセル/秒で計算されます。私が提供する速度が小さすぎる場合、画像は少しスクロールして前の画像に戻ります。速度が大きすぎると、複数の画像をスクロールしますが、距離が非常に短い場合でも、1つずつ移動して次/前の画像にスクロールする必要があります。試してみると、最適な値はデバイスの幅よりもわずかに大きいことがわかりましたが、すべてのデバイスに当てはまるのではないかと思います。

4

1 に答える 1

4

パーティーには少し遅れました。AOSP には、速度の計算に役立つ 2 つのクラスが用意されていますVelocityTracker& ViewConfiguration. トラッカーは MotionEvents を消費し、X/Y 速度を出力します。ViewConfiguration は、さまざまなジェスチャ タイプのしきい値を宣言します。

以下は、フリング ジェスチャを検出するために 2 つのクラスを使用した簡単な例です。

    mVelocityTracker = VelocityTracker.obtain();
    mViewConfiguration = ViewConfiguration.get(mContext);

    mListView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            final int action = event.getActionMasked();
            mVelocityTracker.addMovement(event);

            if (action == MotionEvent.ACTION_UP) {
                mVelocityTracker.computeCurrentVelocity(1000, mViewConfiguration.getScaledMaximumFlingVelocity());
                if (mVelocityTracker.getXVelocity() > mViewConfiguration.getScaledMinimumFlingVelocity()) {
                    // horizontal fling!
                    return true;
                }
            }
            return false;
        }
    });
于 2014-04-29T11:27:56.730 に答える