Aandroid 圖片載入庫Glide 實戰(一),初始,載入進階到實踐
阿新 • • 發佈:2018-12-23
原文: 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