Android 自学之画廊视图(Gallery)功能和用法
Gallery与之前讲的Spinner有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框。他们之间的区别在于Spinner显示的是一个垂直的列表框,而Gallery显示的是一个水平的列表框。Gallery与Spinner有一个区别:Spinner的作用是供用户选择,而Gallery则允许用户通过拖动来查看上一个、下一个列表项。
Gallery常用的XML属性及相关方法
XML属性 | 相关方法 | 说明 |
android:animationDuration | setAnimationDuration(int) | 设置列表项切换时的动画持续时间 |
android:gravity | setGravity(int) | 设置对齐方式 |
android:spacing | setSpacing(int) | 设置Gallery内列表项之间的间距 |
android:unselectedAlpha | setUnselectedAlpha(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 @Override 102 public void onNothingSelected(AdapterView<?> parent) 103 { 104 } 105 }); 106 } 107 }
程序运行后的效果展示: