利用Android 2.2新特性完成縮略圖(二)

 

  在Android 2.2版本之前,如果需要完成縮略圖功能,往往是通過Bitmap、Drawable和Canvas配合完成,需要寫一系列繁雜的邏輯去縮小原有圖片,從而得到縮略圖。但是到了Andorid 2.2版本,如果大家還這麼做,那麼就證明大家已經成爲那個專打怪獸的奧特曼(out man)超人了。

  在Android 2.2版本中,新增了一個ThumbnailUtils工具類來是實現縮略圖,此工具類的功能是強大的,使用是簡單,它提供了一個常量和三個方法。利用這些常數和方法,可以輕鬆快捷的實現圖片和視頻的縮略圖功能。(親,你沒有看錯,還包括生成視頻的縮略圖哦)

  下面將依次說明一下這些常數和方法。

  常數:

    OPTIONS_RECYCLE_INPUT: 從此常量用於表示應該回收extractThumbnail(Bitmap, int, int, int)輸入源圖片(第一個參數),除非輸出圖片就是輸入圖片。

  方法:

    Bitmap createVideoThumbnail(String filePath, int kind)

      從方法名稱即可看出,這個方法用於生成視頻縮略圖。

        參數:

          filePath: 視頻文件路徑

          kind:  文件種類,可以是 MINI_KIND 或 MICRO_KIND

 

    Bitmap extractThumbnail(Bitmap source, int width, int height, int options)

      此方法用於生成一個指定大小的圖片縮略圖。

        參數:

          source: 需要被創造縮略圖的源位圖對象

          width: 生成目標的寬度

          height: 生成目標的高度

          options:在縮略圖抽取時提供的選項

 

    Bitmap extractThumbnail(Bitmap source, int width, int height)

      此方法用於生成一個指定大小的圖片縮略圖。

        參數:

          source: 需要被創造縮略圖的源位圖對象

          width: 生成目標的寬度

          height: 生成目標的高度

  簡單的方法,簡單的常數,看完這些後,就可以開始創建縮略圖了。下面以創建一個美女圖片的縮略圖爲例,展示一下創建縮略圖的步驟:  

  佈局文件 main.xml:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#999999" android:layout_width="fill_parent" android:layout_height="fill_parent">
     <ImageView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:src="@drawable/girl"/>
     <TextView  android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="縮略圖:" android:textColor="#000000"/>
     <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginTop="10dp"/>
 </LinearLayout>


Activity代碼:

public class MainActivity extends Activity {
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        ImageView humbnail = (ImageView) findViewById(R.id.image);        
         
        //獲得一個Drawable對象
        Drawable girl = getResources().getDrawable(R.drawable.girl);
        //將Drawable對象強轉爲Bitmap位圖對象
        Bitmap bitmap = ((BitmapDrawable)girl).getBitmap();
        //利用Bitmap位圖對象生成縮略圖
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, 51, 108);
                 
        humbnail.setImageBitmap(bitmap);
     }
 }


  好了,運行結果出來了,如圖所示,運行結果如預想一樣,創建了一個美女圖片的縮略圖,並且顯示了出來。這樣的結果看上去絲毫問題沒有,但是在這裏,需要指出的是,雖然結果正確,但是過程卻是不正確的。

  “過程不正確,那作者你爲什麼要這麼寫呢?”,這樣的問題可能會出現在各位讀者的腦海中。別急,接下來我就解釋一下我爲什麼要這麼寫,另外再重寫一個正確的代碼給大家。大家注意下面這兩行代碼:

//獲得一個Drawable對象
        Drawable girl = getResources().getDrawable(R.drawable.girl);
        //將Drawable對象強轉爲Bitmap位圖對象
        Bitmap bitmap = ((BitmapDrawable)girl).getBitmap();


 

  我相信絕大部分人都會通過這麼一種強制轉換的方法來實現從Drawable到BitmapDrawable的轉換,這也是網上瘋狂流傳並誤導大家的。首先,利用強制轉換的方法來實現類型轉換這種方式,從代碼的角度看,它是不優雅的,是簡單粗暴的,缺乏代碼的美感;其次,因爲BitmapDrawable是Drawable的子類,所以無法保證沒一個Drawable對象都能正確的強制轉換爲BitmapDrawable,這就給代碼增加了安全的因素。

  其實Google的工程師們提供了從資源文件優雅獲取BitmapDrawable對象的方式。下面,我將貼出真正正確的寫法。

public class MainActivity extends Activity {
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         
        ImageView humbnail = (ImageView) findViewById(R.id.image);        
         
        //通過openRawResource獲取一個InputStream對象
        InputStream input = getResources().openRawResource(R.drawable.girl);
        //通過InputStream創建BitmapDrawable對象
        BitmapDrawable girl = new BitmapDrawable(input);
        //通過BitmapDrawable對象獲取Bitmap對象
        Bitmap bitmap = girl.getBitmap();
        //利用Bitmpa對象創建縮略圖
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, 51, 108);
                 
        humbnail.setImageBitmap(bitmap);
     }
 }

這樣獲取BitmapDrawable對象的方式,是否比前面的代碼優雅並且安全了呢?

 

原文:http://www.cnblogs.com/wisekingokok/archive/2011/08/26/2154140.html

發佈了32 篇原創文章 · 獲贊 39 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章