android之Gallery

Gallery:就是畫廊,在android手機上我們經常會看到有個圖片畫廊,當我們點擊後就會將我們點擊的圖片設置爲手機的背景。今天我們就來實現這麼有個功能,在這個工程中只設了點擊事件,還沒設置劃屏功能(劃屏之後會跟進),在程序中我們設置當我們點擊了圖片之後,我們將點擊的圖片設成背景圖片,並且實現了畫廊圖片能夠循環滾動的效果。

先看效果:

程序開始,未點擊時的效果:

 

當點擊畫廊上的圖片後,我們將點擊的圖片設置成背景圖片,並且用一個Toast將點擊的圖片的id顯示出來

 

 

 

在這個程序裏我是放了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/image_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.image_1,  
  68.                 R.drawable.image_2,  
  69.                 R.drawable.image_3,  
  70.                 R.drawable.image_4,  
  71.                 R.drawable.image_5,  
  72.                 R.drawable.image_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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章