Android之UI学习篇十三:Gallery控件学习

      Gallery组件主要用于横向显示图像列表,不过按常规做法。Gallery组件只能有限地显示指定的图像。也就是说,如果为Gallery组件指定了9张图像,那么当Gallery组件显示到第9张时,就不会再继续显示了。这虽然在大多数时候没有什么关系,但在某些情况下,我们希望图像显示到最后一张时再重第1张开始显示,也就是循环显示。要实现这种风格的Gallery组件,就需要对Gallery的Adapter对象进行一番改进。

  Gallery组件的传统用法

  在实现可循环显示图像的Gallery组件之前先来回顾一下Gallery组件的传统用法。Gallery组件可以横向显示一个图像列表,当单击当前图像的后一个图像时,这个图像列表会向左移动一格,当单击当前图像的前一个图像时,这个图像列表会向右移动一样。也可以通过拖动的方式来向左和向右移动图像列表。当前显示的是第1个图像的效果如图1所示。Gallery组件显示到最后一个图像的效果如图2所示:

       图1

  

   图2



从图2可以看出,当显示到最后一个图像时,列表后面就没有图像的,这也是Gallery组件的基本显示效果。在本文后面的部分将详细介绍如何使Gallery组件显示到最后一个图像时会从第1个图像开始显示。

首先看一下现在的代码:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

   <Gallery 
       android:id="@+id/gallery"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:padding="5px"/>
   <ImageView 
       android:id="@+id/imageview"
       android:layout_marginTop="10px"
       android:layout_width="320px"
       android:layout_height="320px"/>

</LinearLayout>

MainActivity.java

package com.wujay.gallery;

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;

public class MainActivity extends Activity {
	private Gallery gallery;
    private ImageView imgview;
    private int[] imgs = {R.drawable.pic001,R.drawable.pic002,R.drawable.pic003,R.drawable.pic004
    		,R.drawable.pic005,R.drawable.pic006,R.drawable.pic007,R.drawable.pic008,R.drawable.pic009};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imgview = (ImageView)findViewById(R.id.imageview);
        gallery = (Gallery)findViewById(R.id.gallery);
        MyImgAdapter adapter = new MyImgAdapter(this);
        gallery.setAdapter(adapter);
        gallery.setOnItemClickListener(new OnItemClickListener() {
        	
			@Override
			public void onItemClick(AdapterView<?> view, View arg1, int position,
					long arg3) {
				imgview.setImageResource(imgs[position]);
			}
        	
		});
    }
    
    public class MyImgAdapter extends BaseAdapter{
    	 private Context context;//用于接收传递过来的Context对象
         public MyImgAdapter(Context context) {
              super();
              this.context = context;
         }
		@Override
		public int getCount() {
			return imgs.length;
		}

		@Override
		public Object getItem(int position) {
			return imgs[position];
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			//针对每一个数据(即每一个图片ID)创建一个ImageView实例,
			ImageView iv = new ImageView(MainActivity.this);//针对外面传递过来的Context变量,
			iv.setImageResource(imgs[position]);
			iv.setLayoutParams(new Gallery.LayoutParams(80, 80));
			iv.setScaleType(ImageView.ScaleType.FIT_XY);
			return iv;
		}
    	
    }
}

在ImageAdapter类中有两个非常重要的方法:getCount和getView。其中getCount方法用于返回图像总数,要注意的是,这个总数不能大于图像的实际数(可以小于图像的实际数),否则会抛出越界异常。当Gallery组件要显示某一个图像时,就会调用getView方法,并将当前的图像索引(position参数)传入该方法。一般getView方法用于返回每一个显示图像的组件(ImageView对象)。从这一点可以看出,Gallery组件是即时显示图像的,而不是一下将所有的图像都显示出来。在getView方法中除了创建了ImageView对象,还用从resIds数组中获得了相应的图像资源ID来设置在ImageView中显示的图像。最后还设置了Gallery组件的背景显示风格。

循环显示图像的原理

  循环显示有些类似于循环链表,最后一个结点的下一个结点又是第1个结点。循环显示图像也可以模拟这一点。

  也许细心的读者从上一节实现的ImageAdapter类中会发现些什么。对!就是getView方法中的position参数和getCount方法的关系。position参数的值是不可能超过getCount方法返回的值的,也就是说,position参数值的范围是0至getCount() - 1。

 

 如果这时Gallery组件正好显示到最后一个图像,position参数值正好为getCount() - 1。那么我们如何再让Gallery显示下一个图像呢?也就是说让position参数值再增1,对!将getCount()方法的返回值也增1。

  那么这里还有一个问题,如果position参数值无限地增加,就意味着myImageIds数组要不断地增大,这样会大大消耗系统的资源。想到这,就需要解决两个问题:既要position不断地增加,又让resIds数组中保存的图像资源ID是有限的,该怎么做呢?对于getCount()方法非常好解决,可以让getCount方法返回一个很大的数,例如,Integer.MAX_VALUE。这时position参数值就可以随着Gallery组件的图像不断向前移动而增大。现在myImageIds数组只有9个元素,如果position的值超过数组边界,要想继续循环取得数组中的元素(也就是说,当position的值是9时,取myImageIds数组的第0个元素,是9时取第1个元素),最简单的方法就是取余,代码如下:

package com.wujay.gallery;

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;

public class MainActivity extends Activity {
	private Gallery gallery;
    private ImageView imgview;
    private int[] imgs = {R.drawable.pic001,R.drawable.pic002,R.drawable.pic003,R.drawable.pic004
    		,R.drawable.pic005,R.drawable.pic006,R.drawable.pic007,R.drawable.pic008,R.drawable.pic009};
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        imgview = (ImageView)findViewById(R.id.imageview);
        gallery = (Gallery)findViewById(R.id.gallery);
        MyImgAdapter adapter = new MyImgAdapter(this);
        gallery.setAdapter(adapter);
        gallery.setOnItemClickListener(new OnItemClickListener() {
        	
			@Override
			public void onItemClick(AdapterView<?> view, View arg1, int position,
					long arg3) {
				imgview.setImageResource(imgs[position%imgs.length]);
			}
        	
		});
    }
    
    public class MyImgAdapter extends BaseAdapter{
    	 private Context context;//用于接收传递过来的Context对象
         public MyImgAdapter(Context context) {
              super();
              this.context = context;
         }
		@Override
		public int getCount() {
			return Integer.MAX_VALUE;
		}

		@Override
		public Object getItem(int position) {
			return imgs[position];
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			//针对每一个数据(即每一个图片ID)创建一个ImageView实例,
			ImageView iv = new ImageView(MainActivity.this);//针对外面传递过来的Context变量,
			iv.setImageResource(imgs[position%imgs.length]);
			iv.setLayoutParams(new Gallery.LayoutParams(80, 80));
			iv.setScaleType(ImageView.ScaleType.FIT_XY);
			return iv;
		}
    	
    }
}


此时运行效果,当我们滑动到最后一张时的截图:


OK

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值