1. 程式人生 > >Aandroid 圖片載入庫Glide 實戰(一),初始,載入進階到實踐

Aandroid 圖片載入庫Glide 實戰(一),初始,載入進階到實踐

   原文: http://blog.csdn.net/sk719887916/article/details/39989293 skay

初識Glide


為何使用 Glide? 
有經驗的 Android 開發者可以跳過這節,但對於初學者來說,你可能會問自己為什麼你想要去用 Glide,而不是自己去實現。

Android 在處理圖片工作的時候顯得有點娘,因為它會以畫素形式載入圖片到記憶體中去,一張照片平均普通的手機攝像頭尺寸是 2592x1936 畫素(5百萬畫素)將大約會分配 19MB 記憶體。對於複雜的網路情況,快取和圖片處理,如果你用了一個測試完善開發完成的庫,如 Glide,你會省下大量的時間,還不會讓你頭疼!

在這個系列,我們將看到 Glide 的很多特性,去看下這篇部落格的提綱,並考慮你是否真的要去開發所有這些功能。


新增 Glide 

希望我們現在已經說服你去用一個庫去處理你的圖片載入請求了。如果你想要了解更多 Glide 的情況,這就是為你準備的指南!

首先,新增 Glide 到你的依賴中,寫這篇部落格的時候,最新的版本是 Glide 是 3.6.1(譯者:現在是3.7.0了)

Gradle

和大多數依賴一樣,在一個 Gradle 專案中在你的 build.gradle 中新增下面這行程式碼:

compile 'com.github.bumptech.glide:glide:3.6.1'



Maven 

Glide 也支援 Maven 專案:

<dependency>
    <groupId>com.github.bumptech.glide</groupId>
    <artifactId>glide</artifactId>
    <version>3.6.1</version>
    <type>aar</type>
    </dependency>


第一次:從一個 URL 中載入圖片
就像 Picasso, Glide 庫是使用流介面(fluent interface)。對一個完整的功能請求,Glide 建造者要求最少有三個引數。

with(Context context) - 對於很多 Android API 呼叫,Context 是必須的。Glide 在這裡也一樣
load(String imageUrl) - 這裡你可以指定哪個圖片應該被載入,同上它會是一個字串的形式表示一個網路圖片的 URL
into(ImageView targetImageView) 你的圖片會顯示到對應的 ImageView 中。

理論解釋總是蒼白的,所以,看一下實際的例子吧:


    ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
    String internetUrl = "http://i.imgur.com/DvpvklR.png";

    Glide
    .with(context)
    .load(internetUrl)
    .into(targetImageView);


就這樣!如果圖片的 URL 存在並且你的 ImageView 是可見的,你會在幾秒後看到圖片。萬一圖片不存在,Glide 會返回一個錯誤的回撥(我們會在後面討論這個)。你可能已經相信這三行程式碼對你而言是有用的,但是這只是冰山一角啦。

載入方式

從資源中載入 

首先從Android 資源中載入,使用一個資源 id (int),來替換之前使用字串去指明一個網路 URL 的情況。

int resourceId = R.mipmap.ic_launcher;
    
     Glide
    .with(context)
    .load(resourceId)
    .into(imageViewResource);



如果你對於 R.mipmap 有困惑,這是 Android 處理 icon 的新方式。

當然,你可以直接為 ImageView 類去設定資源。然而,如果你用的高階話題如動態轉換來說,這可能是比較有趣的。

從檔案中載入 

其次是從檔案中載入,當你讓使用者選擇一張照片去顯示影象(比如畫廊)這可能會比較有用。該引數只是一個檔案物件。我們看一個例子:

   //這個檔案可能不存在於你的裝置中。然而你可以用任何檔案路徑,去指定一個圖片路徑。

  ` 
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Running.jpg");`
    
    Glide
    .with(context)
    .load(file)
    .into(imageViewFile);


從 Uri 中載入
最後,你也指定一個 Uri 來載入圖片。該請求和之前的沒有什麼不同。

//這可能是任何 Uri。為了演示的目的我們只是用一個 launcher icon 去建立了一個 Uri 
 
`Uri uri = resourceIdToUri(context, R.mipmap.future_studio_launcher);`

    Glide
    .with(context)
    .load(uri)
    .into(imageViewUri);



一個小助手功能:簡單的從資源 id 轉換成 Uri。
    public static final String ANDROID_RESOURCE = "android.resource://";
    public static final String FOREWARD_SLASH = "/";
    
    private static Uri resourceIdToUri(Context context, int resourceId) {
    return Uri.parse(ANDROID_RESOURCE + context.getPackageName() + FOREWARD_SLASH + resourceId);
    }


然而, Uri 不必從資源中去生成,它可以是任何 Uri。

畫廊實現示例:ListView

首先我們需要一些測試圖片。我們從我們的 eatfoody.com 專案中去拿了一些圖片。

  public static String[] eatFoodyImages = {
    "http://i.imgur.com/rFLNqWI.jpg",
    "http://i.imgur.com/C9pBVt7.jpg",
    "http://i.imgur.com/rT5vXE1.jpg",
    "http://i.imgur.com/aIy5R2k.jpg",
    "http://i.imgur.com/MoJs9pT.jpg",
    "http://i.imgur.com/S963yEM.jpg",
    "http://i.imgur.com/rLR2cyc.jpg",
    "http://i.imgur.com/SEPdUIx.jpg",
    "http://i.imgur.com/aC9OjaM.jpg",
    "http://i.imgur.com/76Jfv9b.jpg",
    "http://i.imgur.com/fUX7EIB.jpg",
    "http://i.imgur.com/syELajx.jpg",
    "http://i.imgur.com/COzBnru.jpg",
    "http://i.imgur.com/Z3QjilA.jpg",
    };



其次,我們需要一個 activity,它建立一個 adapter 並設定給一個 ListView。

public class UsageExampleAdapter extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_usage_example_adapter);

        listView.setAdapter(new ImageListAdapter(UsageExampleAdapter.this, eatFoodyImages));
    }
}



再次,看下 adapter 的佈局檔案。這個 ListView 的 item 的佈局檔案是非常簡單的。
 
    <?xml version="1.0" encoding="utf-8"?>
    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="200dp"/>



這回顯示一個圖片列表,每個的高度是 200dp,並且填充裝置的寬度。顯然,這不是最好的圖片畫廊,不過,不要在意這些細節。

在這之前,我們需要為 ListView 實現一個 adapter。讓它看起來是簡單的,並繫結我們的 eatfoody 樣本圖片到 adapter。每個 item 會顯示一個圖片。

 public class ImageListAdapter extends ArrayAdapter {
    private Context context;
    private LayoutInflater inflater;
    
    private String[] imageUrls;
    
    public ImageListAdapter(Context context, String[] imageUrls) {
    super(context, R.layout.listview_item_image, imageUrls);
    
    this.context = context;
    this.imageUrls = imageUrls;
    
    inflater = LayoutInflater.from(context);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    if (null == convertView) {
    convertView = inflater.inflate(R.layout.listview_item_image, parent, false);
    }
    
    Glide
    .with(context)
    .load(imageUrls[position])
    .into((ImageView) convertView);
    
    return convertView;
    }

    }


有趣的事情發生在 ImageListAdapter 類裡的 getView() 方法中。你會看到 Glide 呼叫方式和之前的’常規’載入圖片的方式是完全一樣的。不管你在應用中想要如何去載入,Glide 的使用方式總是一樣的。

作為一個進階的 Android 開發者你需要知道我們需要去重用 ListView 的佈局,去建立一個快速又順滑滾動的體驗。Glide 的魅力是自動處理請求的取消,清楚 ImageView,並載入正確的圖片到對應的 ImageView。

ListView with eatfoody Images

Glide 的一個優勢:快取
當你上下滾動很多次,你會看到圖片顯示的之前的快的多。在比較新的手機上,這甚至都不需要時間去等。你可以會猜測,這些圖片可能是來自快取,而不再是從網路中請求。Glide 的快取實現是基於 Picasso,這對你來說會更加全面的而且做很多事情會更加容易。快取實現的大小是依賴於裝置的磁碟大小。

當載入圖片時,Glide 使用3個來源:記憶體,磁碟和網路(從最快到最慢排序)。再說一次,這裡你不需要做任何事情。Glide 幫你隱藏了所有複雜的情況,同時為你建立了一個智慧的快取大小。我們將在以後的部落格中去了解這塊快取知識。

畫廊實現示例:GridView 

對於 GridView 來說這和 ListView 的實現並沒有什麼不同,你實際上可以用相同的 adapter,只需要在 activity 的佈局檔案改成 GridView:

   <?xml version="1.0" encoding="utf-8"?>
    <GridView
    android:id="@+id/usage_example_gridview"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:numColumns="2"/>

這是結果:



其他應用:ImageView 作為元素 


目前為止,我們僅僅看了整個 adapter 的 item 是一個 ImageView。該方法仍然應用於一個或者多個 ImageView 作為 adapter item 的一部分的情況。你的 getView() 程式碼會有一點不同,但是 Glide 項的載入方式是完全相同的。

展望 

下篇你將會看到 Glide 佔位符 和 漸現動畫   ,圖片重設大小 和 縮放,顯示 Gif 和 Video等相關技術

原文:http://mrfu.me/2016/02/27/Glide_Advanced_Loading/

CSDN原文: http://blog.csdn.net/sk719887916/article/details/39989293  skay