Gallery 是Android官方提供的一個View容器類,繼承于AbsSpinner類,用于實現頁面滑動效果。
從上面的繼承關系可以看出,AbsSpinner類繼承自AdapterView,因此我們可以自定義實現Adapter,來填充Gallery容器的數據。
本示例通過自己實現一個Adapter,來填充Gallery容器的圖片數據,首先看效果:
Activity
ImageAdapter.java
示例分析:
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
ImageAdapter.java
參考推薦: