最近實現了一個gif圖片和普通圖片瀏覽的功能,支持雙擊縮放,單機退出。同時可以選擇使用jni的形式去高效加載gif或者更更精簡的(僅2個類)gif控件
先看效果圖:
##gif圖片加載
由於KJFrameForAndroid自帶的網絡圖片加載並不支持gif的顯示。所以我們需要自定義一個GifRequest類來作爲我們的gif請求類。
首先來看一下主要代碼
public class GifRequest extends Request<byte[]> {
@Override
public Response<byte[]> parseNetworkResponse(NetworkResponse response) {
synchronized (sDecodeLock) {
try {
return doParse(response);
} catch (OutOfMemoryError e) {
KJLoger.debug("Caught OOM for %d byte image, url=%s",
response.data.length, getUrl());
return Response.error(new KJHttpException(e));
}
}
}
private Response<byte[]> doParse(NetworkResponse response) {
if (response.data == null) {
return Response.error(new KJHttpException(response));
} else {
Response<byte[]> b = Response.success(response.data, response.headers,
HttpHeaderParser.parseCacheHeaders(mConfig, response));
return b;
}
}
@Override
protected void deliverResponse(Map<String, String> header, byte[] response) {
if (mCallback != null) {
mCallback.onSuccess(response);
}
}
}
功能非常的簡單,在doParse()方法中,我們通過判斷response.data的內容來得知這次請求是否成功,當請求成功以後,就將這個請求得到的數據通過分發器deliverResponse方法分發到主線程的回調方法中響應。
完整的實現可以參照下文給出的demo源碼。
##gif圖片顯示
當圖片加載到本地了以後,我們所需要做的就是將上面加載到的gif顯示出來。Android的imageview本身是不支持gif顯示的,當然,已經有前人幫我們實現了顯示gif的功能。這裏跟大家推薦兩個gif顯示的控件:1、使了用jni的gif顯示控件; 2、最小體積的顯示方式(只有2個類)
這兩個類各自的優勢就像前面說的,第一個使用了jni,會使apk增大但效率要比第二種使用java代碼逐幀解析高很多;第二種自然就是從apk體積上要小了很多,畢竟僅僅2個類就解決了gif的顯示。
這兩種庫的使用方式在下面的源碼中我都會給出,大家可以自行選擇。
順便說一下在使用jni那個項目的時候遇到了一個問題,報java.lang.UnsatisfiedLinkError: Couldn't load pl_droidsonroids_gif from loader xxxx findLibrary returned null
就是so文件在項目編譯後並沒有打包到apk裏面去(詳細描述見Issue)
就這個問題困擾了我整整一天,最後發現竟然是因爲百度推送的gradle聲明中加入了下面的代碼,查了很久原因才知道這段代碼是爲了兼容老版本的AndroidStudio,而新版本早就已經不再使用了,刪掉就正常了。
task copyNativeLibs(type: Copy) {
from fileTree(dir: 'libs', include: 'armeabi/*.so') into 'build/lib'
}
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniFolders = [new File(buildDir, 'lib')]
}
##完整代碼
有關gif顯示的完整demo,我寫成了一個module開源在GitHub上,大家可以在這裏查看:https://github.com/kymjs/KJGallery
同時跟大家推薦一個移動開發網站:http://www.mobile-open.com/