Android之UI學習篇十三:Gallery控件學習

      Gallery組件主要用於橫向顯示圖像列表,不過按常規做法。Gallery組件只能有限地顯示指定的圖像。也就是說,如果爲Gallery組件指定了9張圖像,那麼當Gallery組件顯示到第9張時,就不會再繼續顯示了。這雖然在大多數時候沒有什麼關係,但在某些情況下,我們希望圖像顯示到最後一張時再重第1張開始顯示,也就是循環顯示。要實現這種風格的Gallery組件,就需要對Gallery的Adapter對象進行一番改進。

  Gallery組件的傳統用法

  在實現可循環顯示圖像的Gallery組件之前先來回顧一下Gallery組件的傳統用法。Gallery組件可以橫向顯示一個圖像列表,當單擊當前圖像的後一個圖像時,這個圖像列表會向左移動一格,當單擊當前圖像的前一個圖像時,這個圖像列表會向右移動一樣。也可以通過拖動的方式來向左和向右移動圖像列表。當前顯示的是第1個圖像的效果如圖1所示。Gallery組件顯示到最後一個圖像的效果如圖2所示:

       圖1

  

   圖2



從圖2可以看出,當顯示到最後一個圖像時,列表後面就沒有圖像的,這也是Gallery組件的基本顯示效果。在本文後面的部分將詳細介紹如何使Gallery組件顯示到最後一個圖像時會從第1個圖像開始顯示。

首先看一下現在的代碼:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

   <Gallery 
       android:id="@+id/gallery"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:padding="5px"/>
   <ImageView 
       android:id="@+id/imageview"
       android:layout_marginTop="10px"
       android:layout_width="320px"
       android:layout_height="320px"/>

</LinearLayout>

MainActivity.java

package com.wujay.gallery;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private Gallery gallery;
    private ImageView imgview;
    private int[] imgs = {R.drawable.pic001,R.drawable.pic002,R.drawable.pic003,R.drawable.pic004
    		,R.drawable.pic005,R.drawable.pic006,R.drawable.pic007,R.drawable.pic008,R.drawable.pic009};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imgview = (ImageView)findViewById(R.id.imageview);
        gallery = (Gallery)findViewById(R.id.gallery);
        MyImgAdapter adapter = new MyImgAdapter(this);
        gallery.setAdapter(adapter);
        gallery.setOnItemClickListener(new OnItemClickListener() {
        	
			@Override
			public void onItemClick(AdapterView<?> view, View arg1, int position,
					long arg3) {
				imgview.setImageResource(imgs[position]);
			}
        	
		});
    }
    
    public class MyImgAdapter extends BaseAdapter{
    	 private Context context;//用於接收傳遞過來的Context對象
         public MyImgAdapter(Context context) {
              super();
              this.context = context;
         }
		@Override
		public int getCount() {
			return imgs.length;
		}

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			//針對每一個數據(即每一個圖片ID)創建一個ImageView實例,
			ImageView iv = new ImageView(MainActivity.this);//針對外面傳遞過來的Context變量,
			iv.setImageResource(imgs[position]);
			iv.setLayoutParams(new Gallery.LayoutParams(80, 80));
			iv.setScaleType(ImageView.ScaleType.FIT_XY);
			return iv;
		}
    	
    }
}

在ImageAdapter類中有兩個非常重要的方法:getCount和getView。其中getCount方法用於返回圖像總數,要注意的是,這個總數不能大於圖像的實際數(可以小於圖像的實際數),否則會拋出越界異常。當Gallery組件要顯示某一個圖像時,就會調用getView方法,並將當前的圖像索引(position參數)傳入該方法。一般getView方法用於返回每一個顯示圖像的組件(ImageView對象)。從這一點可以看出,Gallery組件是即時顯示圖像的,而不是一下將所有的圖像都顯示出來。在getView方法中除了創建了ImageView對象,還用從resIds數組中獲得了相應的圖像資源ID來設置在ImageView中顯示的圖像。最後還設置了Gallery組件的背景顯示風格。

循環顯示圖像的原理

  循環顯示有些類似於循環鏈表,最後一個結點的下一個結點又是第1個結點。循環顯示圖像也可以模擬這一點。

  也許細心的讀者從上一節實現的ImageAdapter類中會發現些什麼。對!就是getView方法中的position參數和getCount方法的關係。position參數的值是不可能超過getCount方法返回的值的,也就是說,position參數值的範圍是0至getCount() - 1。

 

 如果這時Gallery組件正好顯示到最後一個圖像,position參數值正好爲getCount() - 1。那麼我們如何再讓Gallery顯示下一個圖像呢?也就是說讓position參數值再增1,對!將getCount()方法的返回值也增1。

  那麼這裏還有一個問題,如果position參數值無限地增加,就意味着myImageIds數組要不斷地增大,這樣會大大消耗系統的資源。想到這,就需要解決兩個問題:既要position不斷地增加,又讓resIds數組中保存的圖像資源ID是有限的,該怎麼做呢?對於getCount()方法非常好解決,可以讓getCount方法返回一個很大的數,例如,Integer.MAX_VALUE。這時position參數值就可以隨着Gallery組件的圖像不斷向前移動而增大。現在myImageIds數組只有9個元素,如果position的值超過數組邊界,要想繼續循環取得數組中的元素(也就是說,當position的值是9時,取myImageIds數組的第0個元素,是9時取第1個元素),最簡單的方法就是取餘,代碼如下:

package com.wujay.gallery;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private Gallery gallery;
    private ImageView imgview;
    private int[] imgs = {R.drawable.pic001,R.drawable.pic002,R.drawable.pic003,R.drawable.pic004
    		,R.drawable.pic005,R.drawable.pic006,R.drawable.pic007,R.drawable.pic008,R.drawable.pic009};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imgview = (ImageView)findViewById(R.id.imageview);
        gallery = (Gallery)findViewById(R.id.gallery);
        MyImgAdapter adapter = new MyImgAdapter(this);
        gallery.setAdapter(adapter);
        gallery.setOnItemClickListener(new OnItemClickListener() {
        	
			@Override
			public void onItemClick(AdapterView<?> view, View arg1, int position,
					long arg3) {
				imgview.setImageResource(imgs[position%imgs.length]);
			}
        	
		});
    }
    
    public class MyImgAdapter extends BaseAdapter{
    	 private Context context;//用於接收傳遞過來的Context對象
         public MyImgAdapter(Context context) {
              super();
              this.context = context;
         }
		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			//針對每一個數據(即每一個圖片ID)創建一個ImageView實例,
			ImageView iv = new ImageView(MainActivity.this);//針對外面傳遞過來的Context變量,
			iv.setImageResource(imgs[position%imgs.length]);
			iv.setLayoutParams(new Gallery.LayoutParams(80, 80));
			iv.setScaleType(ImageView.ScaleType.FIT_XY);
			return iv;
		}
    	
    }
}


此時運行效果,當我們滑動到最後一張時的截圖:


OK

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章