Chendd's Blog

世界上没有什么事情是一行代码不能解决的。如果有,那就两行。

Android学习日记17--Gallery(画廊视图)

一、Gallery

1、简述

       Gallery有道翻译为画廊,就叫它画廊控件,主要用来可切换的图片展示,左右滑动可以选择上一张或下一张图片。个人感觉蛮实用的,不过google貌似不推荐使用啊!

image

2、常用属性和对应方法如下:

image

3、简单例子:

实现如下例子,C.C女王图片坐镇

image

Activity代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// 要展示图片的ID数组
    int[] imageIDs={
            R.drawable.item0,R.drawable.item1,R.drawable.item2,
            R.drawable.item3,R.drawable.item4,R.drawable.item5
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Gallery gl=(Gallery)this.findViewById(R.id.Gallery01);
        // 适配器
        BaseAdapter ba=new BaseAdapter() {

            //主要是重写getView 方法
            @Override
            public View getView(int position, View arg1, ViewGroup arg2) {
                // TODO Auto-generated method stub
                ImageView iv = new ImageView(MainActivity.this);

                Log.v("gallery", position+"");

                iv.setImageResource(imageIDs[position]);

                iv.setScaleType(ImageView.ScaleType.FIT_XY);
                iv.setLayoutParams(new Gallery.LayoutParams(188,250));
                return iv;
            }

            @Override
            public long getItemId(int arg0) {
                // TODO Auto-generated method stub
                return 0;
            }

            @Override
            public Object getItem(int arg0) {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public int getCount() {
                // TODO Auto-generated method stub

                //return imageIDs.length;
            }
        };

        gl.setAdapter(ba);

        // 设置监听
        gl.setOnItemClickListener(
                new OnItemClickListener(){
                    @Override
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                            int arg2, long arg3) {
                        Gallery gl=(Gallery)findViewById(R.id.Gallery01);
                        gl.setSelection(arg2);
                    }
                }
        );

    }

布局文件较简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_vertical"
    >
   <Gallery
      android:id="@+id/Gallery01"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:spacing="10dip"
      android:unselectedAlpha="1" />
</LinearLayout>

4、扩展例子:

       但是这样做有个弊端,就是图片滑动到最后一张就结束了,如果我想要查看第一张就得一张张的退回去 比较麻烦,不人性化。

image

       我们要实现循环切换图片,从最后一张可跳到第一张去。这时就要修改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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public View getView(int position, View arg1, ViewGroup arg2) {
                // TODO Auto-generated method stub
                ImageView iv = new ImageView(MainActivity.this);

                Log.v("gallery", position+"");

                //iv.setImageResource(imageIDs[position]);
                //通过取余来循环取得imageIDs数组中的图像资源ID
                iv.setImageResource(imageIDs[position%imageIDs.length]);

                iv.setScaleType(ImageView.ScaleType.FIT_XY);
                iv.setLayoutParams(new Gallery.LayoutParams(188,250));
                return iv;
            }

            @Override
            public int getCount() {
                // TODO Auto-generated method stub

                //return imageIDs.length;
                // 返回一个很大的值,例如,Integer.MAX_VALUE
                return Integer.MAX_VALUE;
            }
        };

实现效果:

image

如果有人爱钻牛角尖就会发现,apk启动时第一张不能切换到最后一张。

image

       我曾想getItemId返回的position一开始不是0,而是中间值就行了,比如设为position+imageIDs.length10,在getView()传入position和getItemId返回的position设为position+imageIDs.length10均告失败,日志打印的position初始值都为0,不起作用,还是不能跳到最后一张。后来上网搜了下Gallery有个setSelection可以设置当前position,加入代码,显示成功。

1
gl.setSelection(imageIDs.length*10);

image

Comments