Galleryを使って横スクロールする


今回はGalleryを使って、ImageGalleryを作ってみます。

本サンプルは画像Imageのみをスクロールさせていますが、
作成するAdapter次第では複雑な物も使用出来ます。
それはまたの機会に。

具体的な実装方法は続きで紹介します。

Galleryを使用する為には、BaseAdapterを継承したクラスを
GalleryにsetAdapterする必要があります。

独自クラスの作成

まずは、BaseAdapterを継承した独自クラスImageAdapterを作成します。
注意しなければいけないのは、必ず以下4つのMethodの実装が必要なこと。
・int getCount
・Object getItem(int position)
・long getItemId(int position)
⇛これらについては、今回は深く関わらないので触れません。
・View getView(int position, View convertView, ViewGroup parent)
⇛後述

Gallery要素のBackGround

コンストラクタの中で、後述のattrs.xmlにて定義したGalleryBackImageの
リソースIDを取得し、getViewにおいてsetBackgroundResourceしています。

・obtainStyledAttributes

xmlで定義した値を読み出す。
今回は単にgalleryItemBackgroundのresIDを取得する為に。

	public ImageAdapter(Context ctx) {
	    mContext = ctx;
            TypedArray tmpArry = obtainStyledAttributes(R.styleable.GalleryBackImage);
            BackResId = tmpArry.getResourceId(
                    R.styleable.GalleryBackImage_android_galleryItemBackground, 0);
            tmpArry.recycle();
		}

getView

・View getView(int position, View convertView, ViewGroup parent)

画面上に表示されるGalleryの数だけ「position」の値を変え呼ばれる。
positionはN個の要素を持つ場合、0 〜 N-1まで。
各々の場合において、読み込むべきImageをSetしています。

・ImageView.setScaleType

画像Imageの表示方法を指定します。

CENTER 枠中央を基準にscaleせずに表示
CENTER_CROP 枠中央を基準に横方向へscaleし表示
CENTER_INSIDE 枠中央を基準に枠内へ表示されるようscaleし表示(拡大はしない)
FIT_CENTER 枠中央を基準に縦方向へscaleし表示
FIT_END 枠右端を基準に縦方向へscaleし表示
FIT_START 枠左端を基準に縦方向へscaleし表示
FIT_XY 枠全体にFITする様scaleして表示
MATRIX 枠左上を基準にscaleせずに表示

・ImageView.setLayoutParams

Gallery.LayoutParamsに指定する値は、Gallaryを表示する大きさを指定する。
例)Gallery.LayoutParams(fill_parent,100)
→横方向には1つのみ(横fullx縦100)画面が出る。

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView galleryView = new ImageView(mContext);

			galleryView.setImageResource(mImageIds[position]);
			galleryView.setScaleType(ImageView.ScaleType.FIT_XY);
			galleryView.setLayoutParams(new Gallery.LayoutParams(100, 100));

			galleryView.setBackgroundResource(BackResId);

			return galleryView;
		}

attrs.xml

/res/valuesディレクトリにattrs.xmlを作成する。
Gallery内のリソース全てに適用されるstyleの定義をする。
今回は、プラットフォーム既存のgalleryItemBackgroundを指定している。

<resources>
    <declare-styleable name="GalleryBackImage">
        <attr name="android:galleryItemBackground" />
    </declare-styleable>
</resources>

SourceCode全体/その他

AdapterView.OnItemSelected

Galleryにリスナーとしてsetすることで、
現在FocusされているGalleryの要素のpositionが取得出来ます。

public class Main extends Activity implements AdapterView.OnItemSelectedListener{
	ImageView fullView;

	protected Integer[] mImageIds = {
    		R.drawable.icon1,
    		R.drawable.icon2,
    		R.drawable.icon3,
    		R.drawable.icon4,
    		R.drawable.icon5
    	};

	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Gallery gallery = (Gallery)findViewById(R.id.Gallery);
        gallery.setAdapter(new ImageAdapter(this));
        gallery.setOnItemSelectedListener(this);

        fullView = (ImageView)findViewById(R.id.ImageView_big);
    }

    @Override
    public void onItemSelected(AdapterView parent, View v, int position, long id){
    	fullView.setImageResource(mImageIds[position]);
    }

	@Override
	public void onNothingSelected(AdapterView<?> arg0) {
	}

    class ImageAdapter extends BaseAdapter{
    	int BackResId;

    	private Context mContext;

		public ImageAdapter(Context cnt) {
			mContext = cnt;
            TypedArray a = obtainStyledAttributes(R.styleable.GalleryBackImage);
            BackResId = a.getResourceId(
                    R.styleable.GalleryBackImage_android_galleryItemBackground, 0);
            a.recycle();

		}

		@Override
		public int getCount() {
			return mImageIds.length;
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView galleryView = new ImageView(mContext);

			galleryView.setImageResource(mImageIds[position]);
			galleryView.setScaleType(ImageView.ScaleType.FIT_XY);
			galleryView.setLayoutParams(new Gallery.LayoutParams(100, 100));

			galleryView.setBackgroundResource(BackResId);

			return galleryView;
		}

    }
}
3 Comments