什么是Gallery?
Gallery是一個水平的列表選擇框,它允許用戶通過拖動來查看上一個、下一個列表選項。
下圖是今天要實現的最終效果:
利用Gallery組件實現的一個橫向顯示圖像列表,可以通過左、右滑動屏幕來切換圖像,并加上ImageSwitcher實現一個大圖片預覽功能。
1、一步一步來吧,首先先解決下上半部分(圖像導航)
先來看下效果圖,下圖是利用Gallery組件實現的一個橫向顯示圖像列表,可以通過左、右滑動屏幕來切換圖像。
直接上代碼,注釋很全。
MainActivity.java
1 package com.example.galleytest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.Gallery; 6 /** 7 * 8 * @author Balla_兔子 9 * 和往??刂剖褂梅椒ù笸‘?0 * 1、獲取數據源11 * 2、配置適配器12 * 3、綁定適配器13 */14 public class MainActivity extends Activity {15 16 PRivate Gallery gallery;// 聲明gallery對象17 private ImageAdapter adapter;//聲明自定義adapter對象18 19 // 1、定義數據源20 private int[] images = { R.drawable.item1, R.drawable.item2,21 R.drawable.item3, R.drawable.item4, R.drawable.item5,22 R.drawable.item6, R.drawable.item7, R.drawable.item8,23 R.drawable.item9, R.drawable.item10, R.drawable.item11,24 R.drawable.item12 };25 26 @Override27 protected void onCreate(Bundle savedInstanceState) {28 super.onCreate(savedInstanceState);29 setContentView(R.layout.activity_main);30 31 gallery=(Gallery) findViewById(R.id.gallery);//取得對象32 33 //2、設置適配器34 adapter=new ImageAdapter(images, this);//實例化自定義適配器對象35 36 //3、綁定適配器37 gallery.setAdapter(adapter);38 39 }40 41 }
ImageAdapter.java
1 package com.example.galleytest; 2 3 import android.content.Context; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.BaseAdapter; 7 import android.widget.Gallery; 8 import android.widget.ImageView; 9 import android.widget.ImageView.ScaleType;10 11 //自定義適配器,繼承BaseAdapter復寫方法12 public class ImageAdapter extends BaseAdapter {13 14 private int images[];15 private Context context;16 public ImageAdapter(int res[],Context context){17 this.images=res;18 this.context=context;19 }20 @Override21 //獲取資源總長度22 public int getCount() {23 return images.length;24 }25 26 @Override27 //根據下標id獲取資源對象28 public Object getItem(int position) {29 return images[position];30 }31 32 @Override33 //根據返回下標id34 public long getItemId(int position) {35 return position;36 }37 38 @Override39 //根據下標id返回對象的視圖view40 public View getView(int position, View convertView, ViewGroup parent) {41 //利用ImageView返回圖像展示42 ImageView imageView=new ImageView(context);43 //設置ImageView背景圖44 imageView.setBackgroundResource(images[position]); 45 //setLayoutParams()這個函數用于代碼自定義布局,為創建的view(ImageView)對象設置位置,大小,顏色等一系列的屬性46 imageView.setLayoutParams(new Gallery.LayoutParams(200, 150));47 //設置展示縮放風格48 imageView.setScaleType(ScaleType.FIT_XY);49 return imageView;50 }51 52 }
activity_main.xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 android:orientation="vertical"10 tools:context="com.example.galleytest.MainActivity" >11 <Gallery 12 android:id="@+id/gallery"13 android:layout_width="fill_parent"14 android:layout_height="wrap_content"15 />16 17 </LinearLayout>
執行完上面代碼我們會發現,當圖片滾動到第一張或者最后一張,就自動停止, 我們可以把它設置成無限循環重復的去展示這些圖片。
這里我們只需要去改動自定義ImageAdapter適配器里2個位置就可以實現這個無限循環的效果
其一:返回圖片資源長度,我們返回的長度不再是數組長度,而是一個巨大數
1 //獲取資源總長度2 public int getCount() {3 //return images.length;4 return Integer.MAX_VALUE;//返回一個巨大數5 }
其二:為ImageView設置圖片顯示資源,我們用取余的方法,讓它實現無限循環
1 public View getView(int position, View convertView, ViewGroup parent) { 2 //利用ImageView返回圖像展示 3 ImageView imageView=new ImageView(context); 4 //設置ImageView背景圖 5 imageView.setBackgroundResource(images[position%images.length]); //用取余的方法,讓它實現無限循環 6 //setLayoutParams()這個函數用于代碼自定義布局,為創建的view(ImageView)對象設置位置,大小,顏色等一系列的屬性 7 imageView.setLayoutParams(new Gallery.LayoutParams(200, 150)); 8 //設置展示縮放風格 9 imageView.setScaleType(ScaleType.FIT_XY);10 return imageView;11 }
無限循環輕松搞定,再試試看效果吧~
2、結合ImageSwitcher組件,使得圖片瀏覽效果更為流暢(可以把ImageSwitcher粗略的想象成ImageView的加強版,它可以帶來很多效果,比如圖片動畫)
直接上代碼,依舊人性化注釋全面~
MainActivity.java
1 package com.example.galleytest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.view.animation.AnimationUtils; 7 import android.widget.AdapterView; 8 import android.widget.Gallery; 9 import android.widget.ImageSwitcher;10 import android.widget.ImageView;11 import android.widget.ImageView.ScaleType;12 import android.widget.ViewSwitcher.ViewFactory;13 /**14 * 15 * @author Balla_兔子16 * 和往??刂剖褂梅椒ù笸‘?7 * 1、獲取數據源18 * 2、配置適配器19 * 3、綁定適配器20 * 21 * 為Grallery設置監聽,因要結合ImageSwitcher,這里需要額外的實現一個圖像制造工廠ViewFactory22 */23 public class MainActivity extends Activity implements android.widget.AdapterView.OnItemSelectedListener,ViewFactory{24 25 private Gallery gallery;// 聲明gallery對象26 private ImageSwitcher imageSwitcher;//聲明一個ImageSwitcher對象27 private ImageAdapter adapter;//聲明自定義adapter對象28 29 // 1、定義數據源30 private int[] images = { R.drawable.item1, R.drawable.item2,31 R.drawable.item3, R.drawable.item4, R.drawable.item5,32 R.drawable.item6, R.drawable.item7, R.drawable.item8,33 R.drawable.item9, R.drawable.item10, R.drawable.item11,34 R.drawable.item12 };35 36 @Override37 protected void onCreate(Bundle savedInstanceState) {38 super.onCreate(savedInstanceState);39 setContentView(R.layout.activity_main);40 41 gallery=(Gallery) findViewById(R.id.gallery);//取得對象42 imageSwitcher=(ImageSwitcher) findViewById(R.id.imageSwitcher);//取得對象43 44 //添加監聽45 gallery.setOnItemSelectedListener(this);46 imageSwitcher.setFactory(this);47 //設置動畫效果,圖片在imageSwitch的漸入漸出效果48 imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));49 imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));50 51 52 //2、設置適配器53 adapter=new ImageAdapter(images, this);//實例化自定義適配器對象54 55 //3、綁定適配器56 gallery.setAdapter(adapter);57 58 }59 60 @Override61 //實現ViewFactory里的制造圖像方法,這里需要返回一個view對象,同樣的我們可以采用返回ImageView62 public View makeView() {63 ImageView imageView=new ImageView(this);64 imageView.setScaleType(ScaleType.FIT_CENTER);//展示效果65 return imageView;66 }67 68 //Gallery組件的監聽器69 @Override70 public void onItemSelected(AdapterView<?> parent, View view, int position,71 long id) {72 imageSwitcher.setBackgroundResource(images[position%images.length]);73 }74 75 @Override76 public void onNothingSelected(AdapterView<?> parent) {77 78 }79 80 }
ImageAdapter.java
1 package com.example.galleytest; 2 3 import android.content.Context; 4 import android.view.View; 5 import android.view.ViewGroup; 6 import android.widget.BaseAdapter; 7 import android.widget.Gallery; 8 import android.widget.ImageView; 9 import android.widget.ImageView.ScaleType;10 11 //自定義適配器,繼承BaseAdapter復寫方法12 public class ImageAdapter extends BaseAdapter {13 14 private int images[];15 private Context context;16 public ImageAdapter(int res[],Context context){17 this.images=res;18 this.context=context;19 }20 @Override21 //獲取資源總長度22 public int getCount() {23 //return images.length;24 return Integer.MAX_VALUE;//返回一個巨大數25 }26 27 @Override28 //根據下標id獲取資源對象29 public Object getItem(int position) {30 return images[position];31 }32 33 @Override34 //根據返回下標id35 public long getItemId(int position) {36 return position;37 }38 39 @Override40 //根據下標id返回對象的視圖view41 public View getView(int position, View convertView, ViewGroup parent) {42 //利用ImageView返回圖像展示43 ImageView imageView=new ImageView(context);44 //設置ImageView背景圖45 imageView.setBackgroundResource(images[position%images.length]); //用取余的方法,讓它實現無限循環46 //setLayoutParams()這個函數用于代碼自定義布局,為創建的view(ImageView)對象設置位置,大小,顏色等一系列的屬性47 imageView.setLayoutParams(new Gallery.LayoutParams(200, 150));48 //設置展示縮放風格49 imageView.setScaleType(ScaleType.FIT_XY);50 return imageView;51 }52 53 }
activity_main.xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 android:orientation="vertical"10 tools:context="com.example.galleytest.MainActivity" >11 <Gallery 12 android:id="@+id/gallery"13 android:layout_width="fill_parent"14 android:layout_height="wrap_content"15 />16 17 <ImageSwitcher 18 android:id="@+id/imageSwitcher"19 android:layout_height="wrap_content"20 android:layout_width="fill_parent"21 android:layout_marginTop="20dp"22 ></ImageSwitcher>23 </LinearLayout>
新聞熱點
疑難解答