Android 滑動效果入門篇(二)—— Gallery

Gallery 是Android官方提供的一個View容器類,繼承於AbsSpinner類,用於實現頁面滑動效果。


從上面的繼承關係可以看出,AbsSpinner類繼承自AdapterView,因此我們可以自定義實現Adapter,來填充Gallery容器的數據。


本示例通過自己實現一個Adapter,來填充Gallery容器的圖片數據,首先看效果:




Activity

  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.View;  
  4. import android.widget.AdapterView;  
  5. import android.widget.Gallery;  
  6. import android.widget.Toast;  
  7.   
  8. public class GalleryActivity extends Activity {  
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.   
  14.         Gallery gallery = (Gallery) findViewById(R.id.gallery);  
  15.         gallery.setAdapter(new ImageAdapter(this));         // gallery添加ImageAdapter圖片資源   
  16.         gallery.setOnItemClickListener(listener);           // gallery設置點擊圖片資源的事件   
  17.     }  
  18.       
  19.     AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {  
  20.         @Override  
  21.         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  22.             Toast.makeText(GalleryActivity.this"圖片 " + (position + 1), Toast.LENGTH_SHORT).show();  
  23.         }  
  24.     };  
  25. }  
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.Toast;

public class GalleryActivity extends Activity {
	@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添加ImageAdapter圖片資源
		gallery.setOnItemClickListener(listener); 			// gallery設置點擊圖片資源的事件
	}
	
	AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			Toast.makeText(GalleryActivity.this, "圖片 " + (position + 1), Toast.LENGTH_SHORT).show();
		}
	};
}

ImageAdapter.java

  1. import android.content.Context;  
  2. import android.view.View;  
  3. import android.view.ViewGroup;  
  4. import android.widget.BaseAdapter;  
  5. import android.widget.Gallery;  
  6. import android.widget.ImageView;  
  7.   
  8. public class ImageAdapter extends BaseAdapter {  
  9.     private Context mContext;  
  10.       
  11.     //  圖片數組源   
  12.     private Integer[] imgs = { R.drawable.img1, R.drawable.img2,  
  13.             R.drawable.img3, R.drawable.img4, R.drawable.img5,  
  14.             R.drawable.img6, R.drawable.img7};  
  15.   
  16.     public ImageAdapter(Context c) {  
  17.         mContext = c;  
  18.     }  
  19.   
  20.     @Override  
  21.     public int getCount() {  
  22.         return imgs.length;  
  23.     }  
  24.   
  25.     // 獲取圖片位置   
  26.     @Override  
  27.     public Object getItem(int position) {  
  28.         return imgs[position];  
  29.     }  
  30.   
  31.     // 獲取圖片ID   
  32.     @Override  
  33.     public long getItemId(int position) {  
  34.         return position;  
  35.     }  
  36.   
  37.     @Override  
  38.     public View getView(int position, View convertView, ViewGroup parent) {  
  39.         ImageView imageview = new ImageView(mContext);  
  40.   
  41.         imageview.setImageResource(imgs[position]);  
  42.         imageview.setLayoutParams(new Gallery.LayoutParams(240120));      // 設置佈局 圖片120×120顯示   
  43.         imageview.setScaleType(ImageView.ScaleType.CENTER);             // 設置顯示比例類型(不縮放)   
  44.         return imageview;  
  45.     }  
  46. }  
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
	private Context mContext;
	
	//  圖片數組源
	private Integer[] imgs = { R.drawable.img1, R.drawable.img2,
			R.drawable.img3, R.drawable.img4, R.drawable.img5,
			R.drawable.img6, R.drawable.img7};

	public ImageAdapter(Context c) {
		mContext = c;
	}

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

	// 獲取圖片位置
	@Override
	public Object getItem(int position) {
		return imgs[position];
	}

	// 獲取圖片ID
	@Override
	public long getItemId(int position) {
		return position;
	}

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

		imageview.setImageResource(imgs[position]);
		imageview.setLayoutParams(new Gallery.LayoutParams(240, 120));		// 設置佈局 圖片120×120顯示
		imageview.setScaleType(ImageView.ScaleType.CENTER);				// 設置顯示比例類型(不縮放)
		return imageview;
	}
}


main.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:orientation="vertical">  
  6.       
  7.     <!-- 文字居中顯示  android:gravity -->  
  8.     <!-- 控件居中顯示  android:layout_gravity -->  
  9.       
  10.     <TextView   
  11.         android:id="@+id/tv"  
  12.         android:layout_width="fill_parent"  
  13.         android:layout_height="wrap_content"  
  14.         android:gravity="center"                  
  15.         android:layout_gravity="center"           
  16.         android:layout_marginTop="50dip"  
  17.         android:textColor="#ffff0000"  
  18.         android:textSize="30sp"  
  19.         android:text="Gallery Test"/>  
  20.       
  21.     <Gallery   
  22.     android:id="@+id/gallery"  
  23.     android:layout_width="fill_parent"  
  24.     android:layout_height="wrap_content"  
  25.     android:layout_marginTop="10dip"  
  26.     android:layout_below="@id/tv" />  
  27.       
  28. </RelativeLayout>  
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    
    <!-- 文字居中顯示  android:gravity -->
    <!-- 控件居中顯示  android:layout_gravity -->
    
    <TextView 
        android:id="@+id/tv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"                
        android:layout_gravity="center"         
        android:layout_marginTop="50dip"
        android:textColor="#ffff0000"
        android:textSize="30sp"
        android:text="Gallery Test"/>
    
    <Gallery 
    android:id="@+id/gallery"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:layout_below="@id/tv" />
    
</RelativeLayout>


源碼下載


示例分析:

1、ImageAdapter中,是繼承BaseAdapter自定義實現的,重載了BaseAdapter的幾個虛方法,其中重要的有兩個

getCount() : 返回資源的大小(總長度)

getView(int position, View convertView, ViewGroup parent) : 返回當前顯示的資源(獲取焦點)

2、GalleryActivity中,通過gallery.setAdapter(imgAdapter); 設置資源,然後設置gallery的點擊監聽事件。

3、main.xml中,是佈局文件,顯示一個TextView和Gallery,RelativeLayout是相對佈局

總體來說,Gallery 上述的示例很簡單,結構比較清晰,能夠滿足基本的應用。



Gallery 高級應用

上面的示例,僅僅是最簡單的Gallery應用,如果我們想做的更酷、更炫的效果:

1、Gallery 圖片顯示能夠循環播放,即向右滑到左側第一張圖片後,需要接着顯示最後一張圖片;向左滑到最後一張圖片後,需要接着顯示第一張圖片,往復不間斷顯示的循環效果。

2、選中圖片高亮,未選中圖片陰影,更加突出當前獲取焦點的選中圖片

3、區分“點擊”與“選中”圖片事件的區別和適用場景



效果1 —— 高亮顯示

沒有選中,在GalleryActivity中,設置gallery.setUnselectedAlpha(0.3f); 透明度爲0.3

選中,在ImageAdapter的getView(int position, View convertView, ViewGroup parent)中,設置imageview.setBackgroundColor(Color.alpha(1)); 背景色爲1


效果2 —— 循環播放

原理:Gallery循環播放的原理,跟循環鏈表的思想一樣,首尾item連接都是通過“取餘”實現

修改1、ImageAdapter中的getCount() 方法中,修改返回值爲無窮大 return Integer.MAX_VALUE;

修改2、ImageAdapter中的getView(int position, View convertView, ViewGroup parent)方法中,設置imageview.setImageResource(imgs[position % imgs.length]); 取餘

修改3、GalleryActivity中,設置gallery.setSelection(imgAdapter.imgs.length * 100); 使gallery顯示圖片的位置從中間開始顯示(即imgAdapter.imgs.length * 100)

修改解釋:

修改1,主要是爲了是循環接近無限往復循環,使position無限大,循環在實踐應用上不容易結束(理論上會結束,即2^31-1約20億次循環後)

修改2,通過取餘,使圖片能夠重複利用並顯示

修改3,由於起始位置如果是0,則向右滑動左側將無法循環(此時左側將爲-1,超出了imgs[]數組的下邊界),因此開始應設置起始位置爲imgAdapter.imgs.length的整數倍


效果3 —— “點擊”和“選中”事件

1、點擊事件OnItemClickListener,是需要用手點擊才觸發,滑動時不觸發

2、選中事件OnItemSelectedListener,是當圖片滑到屏幕正中,則視爲自動選中,在滑動的過程中會觸發

適用場景:

1、點擊事件OnItemClickListener,是在確定要選中該項時,才點擊進行邏輯處理

2、選中事件OnItemSelectedListener,可以用來提醒用戶,當前獲取焦點的項,如果確認爲該項則需要點擊OnItemClickListener後,進行下一步的邏輯處理


高級應用完整代碼:


Activity

  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.view.Gravity;  
  4. import android.view.View;  
  5. import android.widget.AdapterView;  
  6. import android.widget.Gallery;  
  7. import android.widget.Toast;  
  8.   
  9. public class GalleryActivity extends Activity {  
  10.       
  11.     private ImageAdapter imgAdapter = null;         // 聲明圖片資源對象   
  12.     private Gallery gallery = null;  
  13.       
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.   
  19.         gallery = (Gallery) findViewById(R.id.gallery);  
  20.         imgAdapter = new ImageAdapter(this);  
  21.         gallery.setAdapter(imgAdapter);                     // 設置圖片資源   
  22.         gallery.setGravity(Gravity.CENTER_HORIZONTAL);      // 設置水平居中顯示   
  23.         gallery.setSelection(imgAdapter.imgs.length * 100);     // 設置起始圖片顯示位置(可以用來製作gallery循環顯示效果)   
  24.           
  25.         gallery.setOnItemClickListener(clickListener);          // 設置點擊圖片的監聽事件(需要用手點擊才觸發,滑動時不觸發)   
  26.         gallery.setOnItemSelectedListener(selectedListener);        // 設置選中圖片的監聽事件(當圖片滑到屏幕正中,則視爲自動選中)   
  27.         gallery.setUnselectedAlpha(0.3f);                   // 設置未選中圖片的透明度   
  28.         gallery.setSpacing(40);                         // 設置圖片之間的間距   
  29.     }  
  30.       
  31.     // 點擊圖片的監聽事件   
  32.     AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {  
  33.         @Override  
  34.         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  35.             Toast.makeText(GalleryActivity.this"點擊圖片 " + (position + 1), 100).show();  
  36.         }  
  37.     };  
  38.       
  39.     // 選中圖片的監聽事件   
  40.     AdapterView.OnItemSelectedListener selectedListener = new AdapterView.OnItemSelectedListener() {  
  41.         @Override  
  42.         public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {  
  43.             Toast.makeText(GalleryActivity.this"選中圖片 " + (position + 1), 20).show();  
  44.         }  
  45.   
  46.         @Override  
  47.         public void onNothingSelected(AdapterView<?> arg0) {  
  48.               
  49.         }  
  50.     };  
  51. }  
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.Toast;

public class GalleryActivity extends Activity {
	
	private ImageAdapter imgAdapter = null;			// 聲明圖片資源對象
	private Gallery gallery = null;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		gallery = (Gallery) findViewById(R.id.gallery);
		imgAdapter = new ImageAdapter(this);
		gallery.setAdapter(imgAdapter); 					// 設置圖片資源
		gallery.setGravity(Gravity.CENTER_HORIZONTAL);		// 設置水平居中顯示
		gallery.setSelection(imgAdapter.imgs.length * 100);		// 設置起始圖片顯示位置(可以用來製作gallery循環顯示效果)
		
		gallery.setOnItemClickListener(clickListener); 			// 設置點擊圖片的監聽事件(需要用手點擊才觸發,滑動時不觸發)
		gallery.setOnItemSelectedListener(selectedListener);		// 設置選中圖片的監聽事件(當圖片滑到屏幕正中,則視爲自動選中)
		gallery.setUnselectedAlpha(0.3f);					// 設置未選中圖片的透明度
		gallery.setSpacing(40);							// 設置圖片之間的間距
	}
	
	// 點擊圖片的監聽事件
	AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			Toast.makeText(GalleryActivity.this, "點擊圖片 " + (position + 1), 100).show();
		}
	};
	
	// 選中圖片的監聽事件
	AdapterView.OnItemSelectedListener selectedListener = new AdapterView.OnItemSelectedListener() {
		@Override
		public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
			Toast.makeText(GalleryActivity.this, "選中圖片 " + (position + 1), 20).show();
		}

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



ImageAdapter.java

  1. import android.content.Context;  
  2. import android.graphics.Color;  
  3. import android.view.View;  
  4. import android.view.ViewGroup;  
  5. import android.widget.BaseAdapter;  
  6. import android.widget.Gallery;  
  7. import android.widget.ImageView;  
  8.   
  9. public class ImageAdapter extends BaseAdapter {  
  10.     private Context mContext;  
  11.       
  12.     //  圖片數組源   
  13.     public Integer[] imgs = { R.drawable.img1, R.drawable.img2,  
  14.             R.drawable.img3, R.drawable.img4, R.drawable.img5,  
  15.             R.drawable.img6, R.drawable.img7};  
  16.   
  17.     public ImageAdapter(Context c) {  
  18.         mContext = c;  
  19.     }  
  20.   
  21.     @Override  
  22.     public int getCount() {  
  23.         return Integer.MAX_VALUE;  
  24.     }  
  25.   
  26.     // 獲取圖片位置   
  27.     @Override  
  28.     public Object getItem(int position) {  
  29.         return imgs[position];  
  30.     }  
  31.   
  32.     // 獲取圖片ID   
  33.     @Override  
  34.     public long getItemId(int position) {  
  35.         return position;  
  36.     }  
  37.   
  38.     @Override  
  39.     public View getView(int position, View convertView, ViewGroup parent) {  
  40.         ImageView imageview = new ImageView(mContext);  
  41.   
  42.         imageview.setImageResource(imgs[position % imgs.length]);  
  43.         imageview.setLayoutParams(new Gallery.LayoutParams(20094));       // 設置佈局 圖片120×120顯示   
  44.         imageview.setScaleType(ImageView.ScaleType.CENTER);             // 設置顯示比例類型   
  45.         imageview.setBackgroundColor(Color.alpha(1));  
  46.         return imageview;  
  47.     }  
  48. }  
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
	private Context mContext;
	
	//  圖片數組源
	public Integer[] imgs = { R.drawable.img1, R.drawable.img2,
			R.drawable.img3, R.drawable.img4, R.drawable.img5,
			R.drawable.img6, R.drawable.img7};

	public ImageAdapter(Context c) {
		mContext = c;
	}

	@Override
	public int getCount() {
		return Integer.MAX_VALUE;
	}

	// 獲取圖片位置
	@Override
	public Object getItem(int position) {
		return imgs[position];
	}

	// 獲取圖片ID
	@Override
	public long getItemId(int position) {
		return position;
	}

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

		imageview.setImageResource(imgs[position % imgs.length]);
		imageview.setLayoutParams(new Gallery.LayoutParams(200, 94));		// 設置佈局 圖片120×120顯示
		imageview.setScaleType(ImageView.ScaleType.CENTER);				// 設置顯示比例類型
		imageview.setBackgroundColor(Color.alpha(1));
		return imageview;
	}
}

源碼下載




參考推薦:

Gallery

Gallery tutorial

發佈了18 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章