1

このトピックに従って、ギャラリーウィジェットを自動スクロールして、5秒ごとに左から右にギャラリーの自動スクロールを作成しました。これが私のギャラリーです:

public class MyBannersGallery extends Gallery {

private Handler handler;

public MyBannersGallery(Context ctx, AttributeSet attrSet) {
    super(ctx, attrSet);
    handler = new Handler();
    postDelayedScrollNext();
}

private void postDelayedScrollNext() {
    handler.postDelayed(new Runnable() {
        public void run() {
            postDelayedScrollNext();
            onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
        }
    }, 5000);

}

private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
    return e2.getX() > e1.getX();
}

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    int kEvent;
    if (isScrollingLeft(e1, e2)) {
        kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
    } else {
        kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
    }
    onKeyDown(kEvent, null);
    return true;
}

}

ギャラリーの最後までスクロールすると停止しました。ここで、ギャラリーが最後までスクロールされているかどうかを検出したいと思います。含まれている場合は、左にスクロールして最初の項目に戻ります。これをアーカイブするには、クラスを何を編集する必要がありますか?

4

2 に答える 2

1

GalleryはAdapterViewから拡張されているため、メソッド'getSelectedItemPosition()'を使用して、現在の画像インデックスがどこにあるかを判断できます。それで、おそらくこのようなものが機能するでしょうか?

private void postDelayedScrollNext() {
    handler.postDelayed(new Runnable() {
        public void run() {
            // check to see if we are at the image is at the last index, if so set the 
            // selection back to 1st image.
            if (getSelectedItemPosition() == getCount() - 1) {
               setSelection(0);
               postDelayedScrollNext();
               return;
            }
            postDelayedScrollNext();

            onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, null);
        }
    }, 5000);

}

もちろん、これは簡単なハックです。ギャラリーが最初のアイテムにうまくスクロールバックする素敵なアニメーションが必要な場合は、追加の作業を行う必要がありますが、考え方は同じです。

于 2012-07-17T04:33:08.877 に答える
0

このフォームは私のために働きます:

public MyBannersGallery(Context context, AttributeSet attrs) {
    super(context, attrs);
    handler = new Handler();
    postDelayedScrollNext(0);
}

private void postDelayedScrollNext(final int position) {
    handler.postDelayed(new Runnable() {
        public void run() {
             if (getSelectedItemPosition() == getCount() - 1) {
               setSelection(0);
               postDelayedScrollNext(0);
               return;
            }
            setSelection(position+1);
            postDelayedScrollNext(position+1);

        }
    }, 4000);

}
于 2015-01-15T18:56:48.797 に答える