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 }

 

程序运行后的效果展示:

posted on 2014-08-19 14:52  杨_静  阅读(3252)  评论(0编辑  收藏  举报

导航