android学习日记17--Gallery(画廊视图)
一、Gallery
1、简述
Gallery有道翻译为画廊,就叫它画廊控件,主要用来可切换的图片展示,左右滑动可以选择上一张或下一张图片。
个人感觉蛮实用的,不过google貌似不推荐使用啊!
2、常用属性和对应方法如下:
3、简单例子:
实现如下例子,C.C女王图片坐镇
Activity代码:
1 // 要展示图片的ID数组 2 int[] imageIDs={ 3 R.drawable.item0,R.drawable.item1,R.drawable.item2, 4 R.drawable.item3,R.drawable.item4,R.drawable.item5 5 }; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 12 Gallery gl=(Gallery)this.findViewById(R.id.Gallery01); 13 // 适配器 14 BaseAdapter ba=new BaseAdapter() { 15 16 //主要是重写getView 方法 17 @Override 18 public View getView(int position, View arg1, ViewGroup arg2) { 19 // TODO Auto-generated method stub 20 ImageView iv = new ImageView(MainActivity.this); 21 22 Log.v("gallery", position+""); 23 24 iv.setImageResource(imageIDs[position]); 25 26 iv.setScaleType(ImageView.ScaleType.FIT_XY); 27 iv.setLayoutParams(new Gallery.LayoutParams(188,250)); 28 return iv; 29 } 30 31 @Override 32 public long getItemId(int arg0) { 33 // TODO Auto-generated method stub 34 return 0; 35 } 36 37 @Override 38 public Object getItem(int arg0) { 39 // TODO Auto-generated method stub 40 return null; 41 } 42 43 @Override 44 public int getCount() { 45 // TODO Auto-generated method stub 46 47 //return imageIDs.length; 48 } 49 }; 50 51 gl.setAdapter(ba); 52 53 // 设置监听 54 gl.setOnItemClickListener( 55 new OnItemClickListener(){ 56 @Override 57 public void onItemClick(AdapterView<?> arg0, View arg1, 58 int arg2, long arg3) { 59 Gallery gl=(Gallery)findViewById(R.id.Gallery01); 60 gl.setSelection(arg2); 61 } 62 } 63 ); 64 65 }
布局文件较简单:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 android:gravity="center_vertical" 7 > 8 <Gallery 9 android:id="@+id/Gallery01" 10 android:layout_width="fill_parent" 11 android:layout_height="wrap_content" 12 android:spacing="10dip" 13 android:unselectedAlpha="1" /> 14 </LinearLayout>
4、扩展例子:
但是这样做有个弊端,就是图片滑动到最后一张就结束了,如果我想要查看第一张就得一张张的退回去
比较麻烦,不人性化。
我们要实现循环切换图片,从最后一张可跳到第一张去。这时就要修改getCount和getView方法
getCount方法用于返回图像总数,这个总数不能大于图像的实际数(可以小于图像的实际数),否则会抛出越界异常。
当Gallery组件要显示某一个图像时,就会调用getView方法,并将当前的图像索引(position参数)传入该方法。
一般getView方法用于返回每一个显示图像的组件(ImageView对象)。从这一点可以看出,Gallery组件是即时显示图像的,
而不是一下将所有的图像都显示出来。在getView方法中除了创建了ImageView对象,还用从imageIDs数组中获得了相应的图像资源ID来设置在ImageView中显示的图像。
实现循环切换主要就是当position等于最后一张图片时,它的下一张又回到第一张position = 0,这时我们想到了取余可以实现,
即position%imageIDs.length,值就在0~imageIDs.length-1之间,此时还要设置getCount的值为无穷大,防止抛出越界异常,
设return Integer.MAX_VALUE。
具体修改代码如下:
1 public View getView(int position, View arg1, ViewGroup arg2) { 2 // TODO Auto-generated method stub 3 ImageView iv = new ImageView(MainActivity.this); 4 5 Log.v("gallery", position+""); 6 7 //iv.setImageResource(imageIDs[position]); 8 //通过取余来循环取得imageIDs数组中的图像资源ID 9 iv.setImageResource(imageIDs[position%imageIDs.length]); 10 11 iv.setScaleType(ImageView.ScaleType.FIT_XY); 12 iv.setLayoutParams(new Gallery.LayoutParams(188,250)); 13 return iv; 14 } 15 16 @Override 17 public int getCount() { 18 // TODO Auto-generated method stub 19 20 //return imageIDs.length; 21 // 返回一个很大的值,例如,Integer.MAX_VALUE 22 return Integer.MAX_VALUE; 23 } 24 };
实现效果:
如果有人爱钻牛角尖就会发现,apk启动时第一张不能切换到最后一张。
我曾想getItemId返回的position一开始不是0,而是中间值就行了,比如设为position+imageIDs.length*10,在getView()传入position和getItemId返回的position设为position+imageIDs.length*10均告失败,日志打印的position初始值都为0,不起作用,还是不能跳到最后一张。后来上网搜了下Gallery有个setSelection可以设置当前position,加入代码,显示成功。
1 gl.setSelection(imageIDs.length*10);