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);

posted @ 2014-03-17 20:18  aiguozhe1991  阅读(886)  评论(0编辑  收藏  举报