Android Gallery

分享到:

Gallery控件可以实现多张图片连续滚动的效果,俗称“画廊”。很多商业APP顶部都会放置一个非常醒目的动态图片Banner,这个效果多数可用Gallery来实现。下面我们通过实例来了解Gallery控件的使用方法。

先看一个效果:


实现一个Gallery我们分解为以下几个步骤
(1) 需要一个Gallery控件,可以用XML布局也可以在java源码中声明
(2) 自定义一个ImageAdapter,ImageAdapter需要继承BaseAdapter,用来给Gallery绑定图片数据
(3) 为ImageAdapter准备一组图片数据
(4) 用Gallery的setAdapter方法把ImageAdapter设置到Gallery本身
完成以上4个步骤一个基本的Gallery效果就形成了,如果需要实现点击监听还要实现Gallery的 OnItemClickListener事件,详情可参考示例代码。

XML布局代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent" >
         <Gallery
          android:id="@+id/gallery1"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content" />
</RelativeLayout>

java代码如下:

package com.my.androidtest;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;
public class GalleryActivity extends Activity {
          Gallery gallery1=null;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_gallery);
  
          gallery1=(Gallery)this.findViewById(R.id.gallery1);
          gallery1.setAdapter(new ImageAdapter(this));
  
          gallery1.setOnItemClickListener(new OnItemClickListener(){
          @Override
  	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
          Toast.makeText(GalleryActivity.this, "点击了第"+ arg2 +"张图", Toast.LENGTH_LONG).show();
          }
          });
  
          }
}


//自定义ImageAdapter继承自BaseAdapter
class ImageAdapter extends BaseAdapter { 
          
          private Integer[] imgs = { 
          R.drawable.img1, 
          R.drawable.img2, 
          R.drawable.img3, 
          R.drawable.img4
          };
  
          private Context mContext; 
  		public ImageAdapter(Context context) { 
          	mContext = context; 
          } 
  
  		public int getCount() { 
          	return imgs.length; 
          } 
  
			public Object getItem(int position) { 
          	return position; 
          } 
  
  		public long getItemId(int position) { 
          	return position; 
          } 
  
  		public View getView(int position, View convertView, ViewGroup parent) { 
          	ImageView image = new ImageView(mContext); 
          	image.setImageResource(imgs[position]); 
          	image.setAdjustViewBounds(true); 
          	image.setLayoutParams(new Gallery.LayoutParams( 
          	LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
          	return image; 
          } 
} 

我们分析一下这段代码:在GalleryActivity这个类的下面又定义了一个类,名为ImageAdapter继承自BaseAdapter,在内部定义了一个数组imgs里面包含4张图片(图片放在drawable目录下)。这在个类中getView是最重要的一个方法,数据绑定就是在这个方法中进行的,我们给Gallery安排了多少张图片getView这个方法就会被执行多少次,通过image.setImageResource(mps[position])这行代码给Gallery中的每一个ImageView进行赋值,最后注意getView方法的返回值是一个View对象,我们可以这么理解:每执行一次getView方法就会生成一个ImageView来对应一张图片,当循环完成后Gallery中所包含的图片就全部显示出来了。

说完ImageAdapter我们再回到上面的类,最重要的一行代码是gallery1.setAdapter(new ImageAdapter(this)),用来把定义好的ImageAdapter设置到gallery,有了这行代码才能显示出图片。接着我们实现了gallery的OnItemClickListener事件,通过这个事件Gallery中每一张图片的点击事件都能监听到了。如果我们想实现点击不通的图片跳转到不同的Activity完成可以在这个事件中进行,其中 arg2 这个参数就是图片的序号(从0开始的)


Gallery常用XML属性:

android:animationDuration 设置布局变化时动画的转换所需的时间(毫秒级)。仅在动画开始时计时。该值必须是整数,比如:100。
android:gravity 指定在对象的X和Y轴上如何放置内容。指定一下常量中的一个或多个(使用 "|"分割)

字符常量

描述

top

0x30

紧靠容器顶端,不改变其大小

bottom

0x50

紧靠容器底部,不改变其大小

left

0x03

紧靠容器左侧,不改变其大小

right

0x05

紧靠容器右侧,不改变其大小

center_vertical

0x10

垂直居中,不改变其大小

fill_vertical

0x70

垂直方向上拉伸至充满容器

center_horizontal

0x01

水平居中,不改变其大小

Fill_horizontal

0x07

水平方向上拉伸使其充满容器

center

0x11

居中对齐,不改变其大小

fill

0x77

在水平和垂直方向上拉伸,使其充满容器

clip_vertical

0x80

垂直剪切(当对象边缘超出容器的时候,将上下边缘超出的部分剪切掉)

clip_horizontal

0x08

水平剪切(当对象边缘超出容器的时候,将左右边缘超出的部分剪切掉)

android:spacing 设置图片之间的间距
android:unselectedAlpha 设置未选中的条目的透明度(Alpha)。该值必须是float类型,比如:"1.2"。
昵    称:
验证码:

相关文档:

Android控件
Android基础知识
Android组件
Android实例