Android の Gallery で無限スクロールと自動再生を実現する方法
Galleryで無限ループと自動回転を実装するには、次の手順に従います
- XMLレイアウトファイルで、Galleryコントロールをレイアウトに追加します。
- アクティビティ上で、Galleryウィジェットのインスタンスを取得して、アダプタとリスナーを設定する。
- Gallery gallery = findViewById(R.id.gallery);
gallery.setAdapter(new ImageAdapter(this)); // カスタムAdapterを設定して画像を表示
gallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// 最後の一枚目の画像までスワイプしたら、自動的に一枚目に切り替える
if (position == (gallery.getCount() – 1)) {
gallery.setSelection(1);
}
// 一枚目の画像の一つ前の仮想画像までスワイプしたら、自動的に最後の一枚目に切り替える
else if (position == 0) {
gallery.setSelection(gallery.getCount() – 2);
}
}@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}); - アダプターを設定する際には、画像を表示するために ImageAdapter クラスを独自に定義する必要があります。
- ImageAdapter内でgetViewメソッドをオーバーライドし、画像をImageView内にロードします。
- ImageAdapterクラスはBaseAdapterを拡張し、コンテキストmContextをprivateフィールドとして持ちます。ImageAdapterのコンストラクタはコンテキストを引数に取り、ImageAdapterインスタンス構築の際にmContextに代入します。getCountメソッドは、画像の配列の長さimageUrls.lengthに2を加えた数を返します。この2つの追加要素は、無限ループを実現するために使用されます。getItemメソッドとgetItemIdメソッドは、それぞれnullと0を返します。getViewメソッドは、ImageViewインスタンスを生成または再利用し、画像の配列imageUrlsから画像をImageViewに設定します。この際、positionをimageUrls.lengthで割った余数を使用し、ループを実現します。
- onCreateメソッドにタイマーのタスクを追加して、自動的にスライドショーを行う。
- TimerTask task = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
int selectedPosition = gallery.getSelectedItemPosition();
gallery.setSelection((selectedPosition + 1) % gallery.getCount());
}
});
}
};
Timer timer = new Timer();
timer.schedule(task, 3000, 3000);
以上の手順で、AndroidのGalleryコントロールの無限ループと自動ローテーション機能を実現できます。