首页 > 代码库 > Android 自学之画廊视图(Gallery)功能和用法

Android 自学之画廊视图(Gallery)功能和用法

Gallery与之前讲的Spinner有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框。他们之间的区别在于Spinner显示的是一个垂直的列表框,而Gallery显示的是一个水平的列表框。Gallery与Spinner有一个区别:Spinner的作用是供用户选择,而Gallery则允许用户通过拖动来查看上一个、下一个列表项。

Gallery常用的XML属性及相关方法

XML属性相关方法说明
android:animationDurationsetAnimationDuration(int)设置列表项切换时的动画持续时间
android:gravitysetGravity(int)设置对齐方式
android:spacingsetSpacing(int)设置Gallery内列表项之间的间距
android:unselectedAlphasetUnselectedAlpha(int)设置没有选中列表项的透明性

Gallery本身的用法非常简单----基本上和Spinner的用法相似,只要为他提供一个内容Adapter即可,该Adapter的getView方法返回的View作为Gallery列表的列表项;如果程序需要监控到Gallery选择项的改变,可以通过为Gallery添加OnItemSelectedListener监听器即可实现。

为此做了一个关于“幻灯片”式图片浏览器的案例,这个案例和我们前面写的Android 自学之网格试图(GridView)和图片切换器(ImageSwitcher)功能和用法这个里面的案例很相似;二者都是带有预览图片的效果,但本案例采用Gallery作为图片预览器,所以界面会更加的友好。Gallery会生成一个“水平列表”,每个列表项就是一张图片预览,而Gallery生成“水平列表”可以让用户拖动来切换列表项。

下面我们先看看案例的布局部分的代码:Layout/main.xml

 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 <!-- 定义一个ImageSwitcher组件 --> 7 <ImageSwitcher android:id="@+id/switcher" 8     android:layout_width="320dp" 9     android:layout_height="320dp"10     />11 <!-- 定义一个Gallery组件 -->12 <Gallery android:id="@+id/gallery"13     android:layout_width="fill_parent"14     android:layout_height="wrap_content"15     android:layout_marginTop="25dp" 16     android:unselectedAlpha="0.6"17     android:spacing="3pt"18     />    19 </LinearLayout>

上面的布局很简单,只定义了两个组件:ImageSwitcher和Gallery组件。主程序也很简单,为ImageSwitcher传入一个ViewFactory对象,为Gallery传入一个Adapter对象。这样ImageSwitcher和Gallery就可以工作了。

为了让ImageSwitcher可以显示Gallery中选中的图片,为Gallery绑定一个叫做OnItemSelectedListener监听。

主程序:GalleryTest.java

  1 package com.yangjing.gallarytest;  2   3 import android.app.Activity;  4 import android.content.res.TypedArray;  5 import android.os.Bundle;  6 import android.view.View;  7 import android.view.ViewGroup;  8 import android.view.ViewGroup.LayoutParams;  9 import android.view.animation.AnimationUtils; 10 import android.widget.AdapterView; 11 import android.widget.AdapterView.OnItemSelectedListener; 12 import android.widget.BaseAdapter; 13 import android.widget.Gallery; 14 import android.widget.ImageSwitcher; 15 import android.widget.ImageView; 16 import android.widget.ViewSwitcher.ViewFactory; 17  18 public class GallaryTest extends Activity{ 19  20     int[] imageIds = new int[] 21     { 22         R.drawable.shuangzi, R.drawable.shuangyu, 23         R.drawable.chunv, R.drawable.tiancheng, R.drawable.tianxie, 24         R.drawable.sheshou, R.drawable.juxie, R.drawable.shuiping, 25         R.drawable.shizi, R.drawable.baiyang, R.drawable.jinniu, 26         R.drawable.mojie }; 27  28     @Override 29     public void onCreate(Bundle savedInstanceState) 30     { 31         super.onCreate(savedInstanceState); 32         setContentView(R.layout.main); 33         final Gallery gallery = (Gallery) findViewById(R.id.gallery); 34         // 获取显示图片的ImageSwitcher对象 35         final ImageSwitcher switcher = (ImageSwitcher)  36             findViewById(R.id.switcher); 37         // 为ImageSwitcher对象设置ViewFactory对象 38         switcher.setFactory(new ViewFactory() 39         { 40             @Override 41             public View makeView() 42             { 43                 ImageView imageView = new ImageView(GallaryTest.this); 44                 imageView.setBackgroundColor(0xff0000); 45                 imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 46                 imageView.setLayoutParams(new ImageSwitcher.LayoutParams( 47                     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 48                 return imageView; 49             } 50         }); 51         // 设置图片更换的动画效果 52         switcher.setInAnimation(AnimationUtils.loadAnimation(this, 53             android.R.anim.fade_in)); 54         switcher.setOutAnimation(AnimationUtils.loadAnimation(this, 55             android.R.anim.fade_out)); 56         // 创建一个BaseAdapter对象,该对象负责提供Gallery所显示的图片 57         BaseAdapter adapter = new BaseAdapter() 58         { 59             @Override 60             public int getCount() 61             { 62                 return imageIds.length; 63             } 64             @Override 65             public Object getItem(int position) 66             { 67                 return position; 68             } 69             @Override 70             public long getItemId(int position) 71             { 72                 return position; 73             } 74  75             // 该方法的返回的View就是代表了每个列表项 76             @Override 77             public View getView(int position, View convertView, ViewGroup parent) 78             { 79                 // 创建一个ImageView 80                 ImageView imageView = new ImageView(GallaryTest.this); 81                 imageView.setImageResource(imageIds[position % imageIds.length]); 82                 // 设置ImageView的缩放类型 83                 imageView.setScaleType(ImageView.ScaleType.FIT_XY); 84                 imageView.setLayoutParams(new Gallery.LayoutParams(75, 100)); 85                 TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery); 86                 imageView.setBackgroundResource(typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0)); 87                 return imageView; 88             } 89         }; 90         gallery.setAdapter(adapter); 91         gallery.setOnItemSelectedListener(new OnItemSelectedListener() 92         { 93             // 当Gallery选中项发生改变时触发该方法 94             @Override 95             public void onItemSelected(AdapterView<?> parent, View view, 96                 int position, long id) 97             { 98                 switcher.setImageResource(imageIds[position % imageIds.length]); 99             }100 101             @Override102             public void onNothingSelected(AdapterView<?> parent)103             {104             }105         });106     }107 }

 

程序运行后的效果展示: