Gallery:就是画廊,在android手机上我们经常会看到有个图片画廊,当我们点击后就会将我们点击的图片设置为手机的背景。今天我们就来实现这么有个功能,在这个工程中只设了点击事件,还没设置划屏功能(划屏之后会跟进),在程序中我们设置当我们点击了图片之后,我们将点击的图片设成背景图片,并且实现了画廊图片能够循环滚动的效果。

先看效果:

程序开始,未点击时的效果:

 

android之Gallery_画廊

当点击画廊上的图片后,我们将点击的图片设置成背景图片,并且用一个Toast将点击的图片的id显示出来

 

android之Gallery_Gallery_02

 

 

在这个程序里我是放了6张图片,先将这六张图片放到上图上方的Gallery中,当点击后,就显示点击的图片,并且将Gallery中的图片不断循环。

首先,要建个GalleryProject工程,在工程的res/drawable下面放入你作为显示的图片,我这里是放了6张图片。

layout中xml文件:

在文件中设置了一个ImageView,这个是拿来显示你点击的图片后的大图的,还设置了一个Gallery,这是个画廊,是用来显示你放在res/drawable中的小图片的。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.      > 
  6.  
  7.     <ImageView 
  8.         android:id="@+id/myImageView" 
  9.         android:layout_width="fill_parent" 
  10.         android:layout_height="fill_parent" 
  11.         android:src="@drawable/p_w_picpath_1"> 
  12.           
  13.     </ImageView> 
  14.      
  15.    <Gallery 
  16.        android:id="@+id/gallery" 
  17.        android:layout_width="fill_parent" 
  18.        android:layout_height="wrap_content" 
  19. //这里是设置在Gallery中每张图片之间的间隔的
  20.        android:spacing="5dp" > 
  21.  
  22.    </Gallery> 
  23.  
  24. </FrameLayout> 

 

 

在values文件中添加attrs.xml文件

attrs.xml文件:

下面的代码就是设置Gallery的背景风格

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.     <declare-styleable name="MainActivity"> 
  4.         <attr name="android:galleryItemBackground"> 
  5.               
  6.         </attr> 
  7.     </declare-styleable> 
  8. </resources> 

再来看看Activaty.java 文件:

 

  1. package com.cheng.gallerytest;  
  2.  
  3.  
  4. import java.lang.System;  
  5. import android.os.Bundle;  
  6. import android.R.integer;  
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.content.res.TypedArray;  
  10. import android.view.Menu;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.widget.AdapterView;  
  14. import android.widget.AdapterView.OnItemClickListener;  
  15. import android.widget.BaseAdapter;  
  16. import android.widget.Gallery;  
  17. import android.widget.ImageView;  
  18. import android.widget.Toast;  
  19.  
  20.  
  21. public class MainActivity extends Activity {  
  22.  
  23.     //定义一个Gallery和一个Imageview  
  24.     private Gallery mGallery;  
  25.     private ImageView mImageView;  
  26.     @Override 
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         super.setContentView(R.layout.activity_main);  
  30.           
  31.         //通过程序获得我们在xml文件中定义的Gallery和ImageView  
  32.         mImageView = (ImageView)findViewById(R.id.myImageView);  
  33.         mGallery = (Gallery)findViewById(R.id.gallery);  
  34.         //给Gallery设置一个图片适配器,通过适配器去找到我们点击的图片  
  35.         mGallery.setAdapter(new ImageAdapter(this));  
  36.         //设置点击事件监听  
  37.         OnItemClickListener oicl = new OnItemClickListener() {  
  38.  
  39.             @Override 
  40.             public void onItemClick(AdapterView<?> parent, View view, int position,  
  41.                     long id) {  
  42.                 // TODO Auto-generated method stub  
  43.                 //当点击时将被点击的图片作为背景显示出来  
  44.                 mImageView.setImageResource(((ImageView)view).getId());  
  45.                 Toast.makeText(getApplicationContext(), "getId:"+((ImageView)view).getId() +"当前图片:"+ position, Toast.LENGTH_LONG).show();  
  46.                   
  47.                   
  48.                   
  49.             }  
  50.         };  
  51.         //将监听事件绑定到我们的Gallery上面  
  52.         mGallery.setOnItemClickListener(oicl);  
  53.     }  
  54.  
  55.     @Override 
  56.     public boolean onCreateOptionsMenu(Menu menu) {  
  57.         // Inflate the menu; this adds items to the action bar if it is present.  
  58.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  59.         return true;  
  60.     }  
  61.     //这是自己实现的图片适配器,它是继承BaseAdapter  
  62.     public class ImageAdapter extends BaseAdapter  
  63.     {  
  64.         int mGalleryItemBackground;  //Item的修饰背景      
  65.         private Context mContext;    //上下文对象  
  66.         private int[] mImage ={     //图片数组  
  67.                 R.drawable.p_w_picpath_1,  
  68.                 R.drawable.p_w_picpath_2,  
  69.                 R.drawable.p_w_picpath_3,  
  70.                 R.drawable.p_w_picpath_4,  
  71.                 R.drawable.p_w_picpath_5,  
  72.                 R.drawable.p_w_picpath_6  
  73.         };   
  74.         public ImageAdapter(Context c)  
  75.         {  
  76.             mContext = c;  
  77.             //通过我们定义的背景风格设置Gallery背景风格  
  78.             TypedArray a = obtainStyledAttributes(R.styleable.MainActivity);  
  79.             mGalleryItemBackground = a.getResourceId(R.styleable.MainActivity_android_galleryItemBackground, 0);  
  80.             a.recycle();  
  81.         }  
  82.         @Override 
  83.         public int getCount() {  
  84.             // TODO Auto-generated method stub  
  85.               
  86.             return Integer.MAX_VALUE;  //为了实现图片的循环,将总数设置的很大,position的值是不断加的,通过position%mImage.length的方式得到图片的位置  
  87.         }  
  88.  
  89.         @Override 
  90.         public Object getItem(int position) {  
  91.             // TODO Auto-generated method stub  
  92.             return position;  
  93.         }  
  94.  
  95.         @Override 
  96.         public long getItemId(int position) {  
  97.             // TODO Auto-generated method stub  
  98.             return position;  
  99.         }  
  100.  
  101.         @Override 
  102.         public View getView(int position, View convertView, ViewGroup parent) {  
  103.             // TODO Auto-generated method stub  
  104.             ImageView i = new ImageView(mContext);  
  105.             //设置ImageView  
  106.             i.setImageResource(mImage[position%mImage.length]);  
  107.             //设置id  
  108.             i.setId(mImage[position%mImage.length]);  
  109.             i.setScaleType(ImageView.ScaleType.FIT_XY);  
  110.             //设置Gallery的布局  
  111.             i.setLayoutParams(new Gallery.LayoutParams(240320));  
  112.             //设置背景风格  
  113.             i.setBackgroundResource(mGalleryItemBackground);  
  114.               
  115.             return i;  
  116.         }  
  117.     }  
  118. }  

      在ImageAdapter类中有两个非常重要的方法:getCount和getView。其中getCount方法用于返回图像总数,要注意的是这个总数是不能大于图像的实际数(可以小于图像的实际数),否则会有越界异常。当Gallery组件要显示某一个图像时,就会调用getView方法,并将当前的图像索引(position)传入该方法。一般getview方法用于返回每一个显示图像的组件,由此可以看出,Gallery组件是及时显示图像的,而不是一下将所有的图像都显示出来。在getView方法中除了创建了ImageView对象,还用从mImage数组中获得了相应的图像资源ID来设置在ImageView中显示的图像。最后设置了Gallery组件的背景显示风格。在这里为了能让我们的Gallery能够循环的显示,我们将GetCount方法中的return返回的值设置了一个很大的整数,但是position是不断的向上加的,所以我将position%mImage.length作为我们图片的position,这样我们的Gallery就可以循环的显示了。

 

ok,睡觉了。

工程下载地址:

http://down.51cto.com/data/672711