一、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);
========个人网站:http://chendd.com/ 文章很多是上面搬过来的,以后都在个人网站上更新,有兴趣的可以移步☺========