支持gif的圖片預覽控件 原

最近實現了一個gif圖片和普通圖片瀏覽的功能,支持雙擊縮放,單機退出。同時可以選擇使用jni的形式去高效加載gif或者更更精簡的(僅2個類)gif控件

先看效果圖:
KJGallery

##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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章