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

Android應用實例之動態展示assets下圖片

實現的功能:在ImageView中動態(每隔0.1秒)展示assets下圖片,所有圖片播放完畢後再重新開始播放。

實現思路:

1)通過AssetManager獲取assets下資源,使用BitmapFactory將圖片資源輸入流轉換為Bitmap對象,然後將Bitmap對象設置到ImageView組件中。

 2)動態展示圖片(模擬間隔0.1秒)在子線程中操作,Android子線程是不能更新UI的,需要借助Handler(運行在主線程中)與子線程通過Message傳遞數據,完成更新UI的操作。

關鍵技術點:AssetManager應用、Bitmap對象回收技術、Handler應用、多線程及線程的終止等。

第1步:新建一個工程,命名為DisplayImagesDemo,Activity命名為DisplayImagesActivity。

第2步:往assets下拷貝幾張測試用圖片,然後修改main.xml文件,代碼如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.   
  6.     <ImageView android:id="@+id/image" android:layout_width="fill_parent"  
  7.         android:layout_height="wrap_content" android:padding="5px"  
  8.         android:layout_weight="1" />  
  9.     <LinearLayout style="@android:style/ButtonBar"  
  10.         android:layout_width="fill_parent" android:layout_height="wrap_content"  
  11.         android:orientation="horizontal">  
  12.         <Button android:id="@+id/btnStart" android:text="開始播放"  
  13.             android:layout_width="0dip" android:layout_height="wrap_content"  
  14.             android:layout_weight="1" />  
  15.         <Button android:id="@+id/btnStop" android:text="停止播放"  
  16.             android:layout_width="0dip" android:layout_height="wrap_content"  
  17.             android:layout_weight="1" />  
  18.     </LinearLayout>  
  19. </LinearLayout>  

第3步:修改DisplayImagesActivity,代碼如下

  1. package com.zyg.demo.assets;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import android.app.Activity;  
  6. import android.content.res.AssetManager;  
  7. import android.graphics.BitmapFactory;  
  8. import android.graphics.drawable.BitmapDrawable;  
  9. import android.os.Bundle;  
  10. import android.os.Handler;  
  11. import android.os.Message;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.Button;  
  15. import android.widget.ImageView;  
  16.   
  17. public class DisplayImagesActivity extends Activity {  
  18.     private AssetManager assets = null;  
  19.     private String[] images = null;  
  20.     private int currentImg = 0;  
  21.     private ImageView image;  
  22.     private Button btnStart;  
  23.     private Button btnStop;  
  24.     // 定義一個負責更新圖片的Handler   
  25.     private Handler handler = null;  
  26.     private Thread thread = null;  
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         //初始化視圖   
  32.         onInitView();  
  33.         //獲取assets下圖片   
  34.         images = getImages();  
  35.         //displayAssets();   
  36.     }  
  37.   
  38.     private void onInitView(){  
  39.         image = (ImageView) findViewById(R.id.image);  
  40.         btnStart = (Button) findViewById(R.id.btnStart);  
  41.         btnStart.setOnClickListener(listener);  
  42.   
  43.         btnStop = (Button) findViewById(R.id.btnStop);  
  44.         btnStop.setOnClickListener(listener);  
  45.           
  46.         handler = new Handler() {  
  47.             public void handleMessage(android.os.Message msg) {  
  48.                 // 表明消息是該程序發出的   
  49.                 if (msg.what == 0x110) {  
  50.                     // 展示下一張圖片   
  51.                     dispalyNextImage();  
  52.                 }  
  53.             };  
  54.         };  
  55.     }  
  56.       
  57.     private String[] getImages(){  
  58.         String[] tempImages = null;  
  59.         try {  
  60.             assets = getAssets();  
  61.             // 獲取/assets/目錄下所有文件   
  62.             if(null!=assets){  
  63.                 tempImages = assets.list("");  
  64.             }  
  65.         } catch (IOException e) {  
  66.             e.printStackTrace();  
  67.         }finally{  
  68.             return tempImages;  
  69.         }  
  70.     }  
  71.       
  72.     View.OnClickListener listener = new OnClickListener() {  
  73.         @Override  
  74.         public void onClick(View v) {  
  75.             if (v == btnStart) {  
  76.                 if(thread==null){  
  77.                     thread = new Thread() {  
  78.                         @Override  
  79.                         public void run() {  
  80.                             Thread curThread = Thread.currentThread();  
  81.                             while (thread!=null && thread == curThread) {  
  82.                                 try {  
  83.                                     Thread.sleep(100);  
  84.                                     Message msg = new Message();  
  85.                                     msg.what = 0x110;  
  86.                                     handler.sendMessage(msg);  
  87.                                 } catch (InterruptedException e) {  
  88.                                     e.printStackTrace();  
  89.                                 }  
  90.                             }  
  91.                         }  
  92.                     };  
  93.                     thread.start();  
  94.                 }  
  95.             } else if (v == btnStop) {  
  96.                 Thread temp = thread;  
  97.                 thread = null;  
  98.                 temp.interrupt();  
  99.             }  
  100.         }  
  101.     };  
  102.   
  103.     // 展示assets內容   
  104.     private void displayAssets() {  
  105.         int length = images.length;  
  106.         String str = null;  
  107.         for (int i = 0; i < length; i++) {  
  108.             str = images[i];  
  109.             System.out.println(i + "=" + str);  
  110.         }  
  111.     }  
  112.   
  113.     // 展示下一張圖片   
  114.     private void dispalyNextImage() {  
  115.         // 如果發生數組越界   
  116.         if (currentImg >= images.length) {  
  117.             currentImg = 0;  
  118.         }  
  119.         //備注1   
  120.         // 找到下一個圖片文件   
  121.         while (!images[currentImg].endsWith(".png")  
  122.                 && !images[currentImg].endsWith(".jpg")  
  123.                 && !images[currentImg].endsWith(".gif")) {  
  124.             currentImg++;  
  125.             // 如果已發生數組越界   
  126.             if (currentImg >= images.length) {  
  127.                 currentImg = 0;  
  128.             }  
  129.         }  
  130.   
  131.         InputStream assetFile = null;  
  132.         try {  
  133.             // 打開指定資源對應的輸入流   
  134.             assetFile = assets.open(images[currentImg++]);  
  135.         } catch (IOException e) {  
  136.             e.printStackTrace();  
  137.         }  
  138.           
  139.         BitmapDrawable bitmapDrawable = (BitmapDrawable) image.getDrawable();  
  140.         //備注2   
  141.         // 如果圖片還未回收,先強制回收該圖片   
  142.         if (bitmapDrawable != null && !bitmapDrawable.getBitmap().isRecycled()){  
  143.             bitmapDrawable.getBitmap().recycle();  
  144.         }  
  145.         // 改變ImageView顯示的圖片   
  146.         image.setImageBitmap(BitmapFactory.decodeStream(assetFile));  
  147.     }  
  148. }  

備注1:

之所以如此處理是因為assets下除了圖片資源還有images、sounds和webkit,打開onCreate下的displayAssets()方法,可以看到輸出日志。

備注2:

 如果系統頻繁地去解析、創建Bitmap對象,可能由於前面創建的Bitmap所占用的內存還沒有回收(手機系統本身的內容就比較小),而導致程序運行時引發OutOfMemory錯誤。

 事實上,如果將備注2回收Bitmap對象的語句注釋掉,圖片動態展示若干張(視具體情況而定,我在模擬器裡運行只展示了4張就掛掉了),錯誤日志為:

INFO/ActivityManager(73): Low Memory: No more background processes.

第4步:運行程序,效果如下:

Copyright © Linux教程網 All Rights Reserved