歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中ImageSwitcher結合Gallery展示SD卡中的資源圖片

本文主要是寫關於ImageSwitcher結合Gallery組件如何展示SDCard中的資源圖片,相信大家都看過API Demo 中也有關於這個例子的,但API Demo 中的例子是展示工程中Drawable目錄下的資源圖片,這樣調用系統的API比較容易實現,但我們在開發項目過程中,但有些圖片還不能完全確定下來,例如需要展示相機拍照的圖片,SDCard中某個目錄下的資源圖片等功能。其實系統中也提供相應的API給我們應用去實現該功能,下面就用異於API Demo中例子方式展示下如何實現該功能。

【1】我們先看下該例子代碼的結構圖:


下面就直接上各個文件的代碼了,不在這裡詳細解釋了,最後會看到實現的效果圖的..呵呵

【2】res/layout/main.xml 文件源碼:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"   
  6.     android:background="#55000000" >  
  7.       
  8.     <TextView   
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:gravity="center"  
  12.         android:text="Welcome to Andy.Chen's Blog!"  
  13.         android:textSize="20sp"/>  
  14.       
  15.     <ImageSwitcher  
  16.         android:id="@+id/switcher"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="350dip"  
  19.         android:layout_alignParentLeft="true"  
  20.         android:layout_alignParentRight="true" />  
  21.   
  22.     <Gallery  
  23.         android:id="@+id/mygallery"  
  24.         android:layout_width="fill_parent"  
  25.         android:layout_height="80dp"  
  26.         android:layout_alignParentBottom="true"  
  27.         android:layout_alignParentLeft="true"  
  28.         android:gravity="center_vertical"  
  29.         android:spacing="16dp" />  
  30.       
  31. </LinearLayout>  
【3】res/values/attrs.xml 文件源碼:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.       
  4.   <declare-styleable name="Gallery">   
  5.     <attr name="android:galleryItemBackground" />   
  6.   </declare-styleable>   
  7.       
  8. </resources>  
【4】ImageSwitcherAndGalleryDemoActivity.java 源碼:(這個類的源碼比較多,希望大家耐心看)
  1. package com.andyidea.imagedemo;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.content.res.TypedArray;  
  10. import android.graphics.Bitmap;  
  11. import android.graphics.BitmapFactory;  
  12. import android.net.Uri;  
  13. import android.os.Bundle;  
  14. import android.os.Environment;  
  15. import android.util.Log;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.view.ViewGroup;  
  19. import android.view.animation.AnimationUtils;  
  20. import android.widget.AdapterView;  
  21. import android.widget.AdapterView.OnItemClickListener;  
  22. import android.widget.AdapterView.OnItemSelectedListener;  
  23. import android.widget.BaseAdapter;  
  24. import android.widget.Gallery;  
  25. import android.widget.Gallery.LayoutParams;  
  26. import android.widget.ImageSwitcher;  
  27. import android.widget.ImageView;  
  28. import android.widget.Toast;  
  29. import android.widget.ViewSwitcher.ViewFactory;  
  30.   
  31. /**  
  32.  * ImageSwitcher和Gallery如何展示SD卡中的資源圖片  
  33.  * @author Andy.Chen  
  34.  * @email:[email protected]  
  35.  */  
  36. public class ImageSwitcherAndGalleryDemoActivity extends Activity   
  37.              implements OnItemSelectedListener,ViewFactory{  
  38.       
  39.     private List<String> imagePathList;   
  40.     private String[] list;   
  41.     private ImageSwitcher mSwitcher;  
  42.     private Gallery mGallery;  
  43.   
  44.       
  45.     /** Called when the activity is first created. */  
  46.     @Override  
  47.     public void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         setContentView(R.layout.main);  
  50.           
  51.         imagePathList=getImagePathFromSD();   
  52.         list = imagePathList.toArray(new String[imagePathList.size()]);   
  53.       
  54.         /* 設定Switcher */  
  55.         mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);  
  56.         mSwitcher.setFactory(this);  
  57.         /* 設定載入Switcher的模式 */  
  58.         mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,  
  59.                 android.R.anim.fade_in));  
  60.         /* 設定輸出Switcher的模式 */  
  61.         mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,  
  62.                 android.R.anim.fade_out));  
  63.         mSwitcher.setOnClickListener(new OnClickListener() {  
  64.   
  65.             public void onClick(View v) {  
  66.                 Toast.makeText(ImageSwitcherAndGalleryDemoActivity.this, "你點擊了ImageSwitch上的圖片",  
  67.                         Toast.LENGTH_SHORT).show();  
  68.   
  69.             }  
  70.   
  71.         });  
  72.   
  73.         mGallery = (Gallery) findViewById(R.id.mygallery);  
  74.         /* 新增幾ImageAdapter並設定給Gallery對象 */  
  75.         mGallery.setAdapter(new ImageAdapter(this, getImagePathFromSD()));  
  76.   
  77.         mGallery.setOnItemSelectedListener(this);  
  78.   
  79.         /* 設定一個itemclickListener事件 */  
  80.         mGallery.setOnItemClickListener(new OnItemClickListener() {  
  81.             public void onItemClick(AdapterView<?> parent, View v,  
  82.                     int position, long id) {  
  83.                 Toast.makeText(ImageSwitcherAndGalleryDemoActivity.this, "你點擊了Gallery上的圖片",  
  84.                         Toast.LENGTH_SHORT).show();  
  85.             }  
  86.         });  
  87.   
  88.     }  
  89.       
  90.     /** 從SD卡中獲取資源圖片的路徑 */  
  91.     private List<String> getImagePathFromSD() {  
  92.         /* 設定目前所在路徑 */  
  93.         List<String> it = new ArrayList<String>();  
  94.           
  95.         //根據自己的需求讀取SDCard中的資源圖片的路徑  
  96.         String imagePath = Environment.getExternalStorageDirectory().toString()+"/hknational/image";  
  97.           
  98.         File mFile = new File(imagePath);  
  99.         File[] files = mFile.listFiles();  
  100.   
  101.         /* 將所有文件存入ArrayList中 */  
  102.         for (int i = 0; i < files.length; i++) {  
  103.             File file = files[i];  
  104.             if (checkIsImageFile(file.getPath()))  
  105.                 it.add(file.getPath());  
  106.         }  
  107.         return it;  
  108.     }  
  109.   
  110.     /** 判斷是否相應的圖片格式  */  
  111.     private boolean checkIsImageFile(String fName) {  
  112.         boolean isImageFormat;  
  113.   
  114.         /* 取得擴展名 */  
  115.         String end = fName  
  116.                 .substring(fName.lastIndexOf(".") + 1, fName.length())  
  117.                 .toLowerCase();  
  118.   
  119.         /* 按擴展名的類型決定MimeType */  
  120.         if (end.equals("jpg") || end.equals("gif") || end.equals("png")  
  121.                 || end.equals("jpeg") || end.equals("bmp")) {  
  122.             isImageFormat = true;  
  123.         } else {  
  124.             isImageFormat = false;  
  125.         }  
  126.         return isImageFormat;  
  127.     }  
  128.   
  129.     /* 改寫BaseAdapter自定義一ImageAdapter class */  
  130.     public class ImageAdapter extends BaseAdapter {  
  131.         /* 聲明變量 */  
  132.         int mGalleryItemBackground;  
  133.         private Context mContext;  
  134.         private List<String> lis;  
  135.   
  136.         /* ImageAdapter的構造符 */  
  137.         public ImageAdapter(Context c, List<String> li) {  
  138.             mContext = c;  
  139.             lis = li;  
  140.             /*  
  141.              * 使用res/values/attrs.xml中的<declare-styleable>定義 的Gallery屬性.  
  142.              */  
  143.             TypedArray mTypeArray = obtainStyledAttributes(R.styleable.Gallery);  
  144.             /* 取得Gallery屬性的Index id */  
  145.             mGalleryItemBackground = mTypeArray.getResourceId(  
  146.                     R.styleable.Gallery_android_galleryItemBackground, 0);  
  147.             /* 讓對象的styleable屬性能夠反復使用 */  
  148.             mTypeArray.recycle();  
  149.         }  
  150.   
  151.         /* 重寫的方法getCount,傳回圖片數目 */  
  152.         public int getCount() {  
  153.             return lis.size();  
  154.         }  
  155.   
  156.         /* 重寫的方法getItem,傳回position */  
  157.         public Object getItem(int position) {  
  158.             return position;  
  159.         }  
  160.   
  161.         /* 重寫的方法getItemId,傳並position */  
  162.         public long getItemId(int position) {  
  163.             return position;  
  164.         }  
  165.   
  166.         /* 重寫方法getView,傳並幾View對象 */  
  167.         public View getView(int position, View convertView, ViewGroup parent) {  
  168.             /* 產生ImageView對象 */  
  169.             ImageView i = new ImageView(mContext);  
  170.             /* 設定圖片給imageView對象 */  
  171.             Bitmap bm = BitmapFactory.decodeFile(lis.get(position).toString());  
  172.             i.setImageBitmap(bm);  
  173.             /* 重新設定圖片的寬高 */  
  174.             i.setScaleType(ImageView.ScaleType.FIT_XY);  
  175.             /* 重新設定Layout的寬高 */  
  176.             i.setLayoutParams(new Gallery.LayoutParams(136, 88));  
  177.             /* 設定Gallery背景圖 */  
  178.             i.setBackgroundResource(mGalleryItemBackground);  
  179.             /* 傳回imageView對象 */  
  180.             return i;  
  181.         }  
  182.     }   
  183.   
  184.     @Override  
  185.     public View makeView() {  
  186.         ImageView iv = new ImageView(this);   
  187.         iv.setBackgroundColor(0xFF000000);   
  188.         iv.setScaleType(ImageView.ScaleType.FIT_CENTER);   
  189.         iv.setLayoutParams(new ImageSwitcher.LayoutParams(   
  190.             LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));   
  191.         return iv;   
  192.     }  
  193.   
  194.     @Override  
  195.     public void onItemSelected(AdapterView<?> parent, View view, int position,  
  196.             long id) {  
  197.         // TODO Auto-generated method stub  
  198.         String photoURL = list[position];  
  199.         Log.i("A", String.valueOf(position));  
  200.           
  201.         mSwitcher.setImageURI(Uri.parse(photoURL));  
  202.     }  
  203.   
  204.     @Override  
  205.     public void onNothingSelected(AdapterView<?> parent) {  
  206.         // TODO Auto-generated method stub  
  207.           
  208.     }  
  209. }  
【5】程序運行效果圖如下:

        

至此大功告成了!

本文為 Andy.Chen原創,歡迎大家轉載,轉載請注明出處,謝謝大家關注。

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved