giflib是一款用C语言写的加载GIF库,在性能方面比Glide要好很多,首先来看一下性能对比。

glide加载gif

giflib加载gif

 从上图中我们可以看出在CPU使用率上,giflib比glide好很多了,内存占用上giflib比glide也要好一些。那么如何使用giflib尼?

 首先需要下载framesequence及giflib(以上网站需要翻墙,请自备梯子)

 giflib文件目录如下:


 framesequence文件目录如下:


 下载完毕后,我们就将framesequence下的jni目录复制到as的main下,giflib复制到jni/giflib目录下。目录结构如下(删除了与webp相关的文件):


 这样就可以开始编译so文件了,但是由于giflib使用的是Android.bp进行编译的(不会呀o(╥﹏╥)o)。所有我就根据Android.bp来重新写了份Android.mk文件,然后ndk-build该文件即可。


#
# Copyright (C) 2014 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gif
LOCAL_SRC_FILES := \giflib/dgif_lib.c \giflib/egif_lib.c \giflib/gifalloc.c \giflib/gif_err.c \giflib/gif_hash.c \giflib/openbsd-reallocarray.c \giflib/quantize.cLOCAL_CFLAGS += \-Werror \-Wno-format \-Wno-sign-compare \-Wno-unused-parameter \-DHAVE_CONFIG_H \LOCAL_SDK_VERSION := 8include $(BUILD_STATIC_LIBRARY)include $(CLEAR_VARS)
## Main libraryLOCAL_STATIC_LIBRARIES := gifLOCAL_LDFLAGS := -llog -ljnigraphicsLOCAL_C_INCLUDES := \giflibLOCAL_MODULE := framesequence
LOCAL_SRC_FILES := \BitmapDecoderJNI.cpp \FrameSequence.cpp \FrameSequenceJNI.cpp \FrameSequence_gif.cpp \JNIHelpers.cpp \Registry.cpp \Stream.cppifeq ($(FRAMESEQUENCE_INCLUDE_WEBP),true)LOCAL_C_INCLUDES += external/webp/includeLOCAL_SRC_FILES += FrameSequence_webp.cppLOCAL_STATIC_LIBRARIES += libwebp-decode
endifLOCAL_CFLAGS += \-Wall \-Werror \-Wno-unused-parameter \-Wno-unused-variable \-Wno-overloaded-virtual \-fvisibility=hidden \LOCAL_SDK_VERSION := 8include $(BUILD_SHARED_LIBRARY)

 由于没有使用CMake,所以应该在build.gradle下进行如下配置

externalNativeBuild{
ndkBuild{
path “src/main/jni/Android.mk”
}
}

 最后我们点击rebuild即可生成so文件。那么如何使用尼?

 在使用之前需要将framesequence目录下的src里面的所有文件拷贝到as的Java目录下。然后就可以使用了。使用代码如下(也可以去阅读framesequence下的示例代码):

FrameSequenceDrawable mDrawable;int mResourceId;// This provider is entirely unnecessary, just here to validate the acquire/release processprivate class CheckingProvider implements FrameSequenceDrawable.BitmapProvider {HashSet<Bitmap> mBitmaps = new HashSet<Bitmap>();@Overridepublic Bitmap acquireBitmap(int minWidth, int minHeight) {Bitmap bitmap =Bitmap.createBitmap(minWidth + 1, minHeight + 4, Bitmap.Config.ARGB_8888);mBitmaps.add(bitmap);return bitmap;}@Overridepublic void releaseBitmap(Bitmap bitmap) {if (!mBitmaps.contains(bitmap)) throw new IllegalStateException();mBitmaps.remove(bitmap);bitmap.recycle();}public boolean isEmpty() {return mBitmaps.isEmpty();}}final CheckingProvider mProvider = new CheckingProvider();//传入资源,设置相关参数InputStream is = getResources().openRawResource(mResourceId);FrameSequence fs = FrameSequence.decodeStream(is);//传入的是InputStreammDrawable = new FrameSequenceDrawable(fs, mProvider);
//        mDrawable.setLoopBehavior(LOOP_FINITE);//只播放一次mDrawable.setOnFinishedListener(new FrameSequenceDrawable.OnFinishedListener() {@Overridepublic void onFinished(FrameSequenceDrawable drawable) {Toast.makeText(getApplicationContext(),"The animation has finished", Toast.LENGTH_SHORT).show();}});drawableView.setBackgroundDrawable(mDrawable);
//开始播放mDrawable.start();//暂停播放mDrawable.stop();//裁剪成圆形mDrawable.setCircleMaskEnabled(!mDrawable.getCircleMaskEnabled());

 目前giflib加载的都是本地的,那么如何加载线上GIF尼?其实可以把giflib与glide结合起来,由glide负责下载、缓存等的实现,giflib来负责GIF的加载。具体实现可以参考我写的一个demo

giflib加载GIF相关推荐

  1. giflib加载GIF文件

     giflib是一款用C语言写的加载GIF库,在性能方面比Glide要好很多,首先来看一下性能对比. glide加载gif giflib加载gif  从上图中我们可以看出在CPU使用率上,giflib ...

  2. java 加载gif_android使用giflib加载gif

    属于个人所创,转载请标明文章出处: 背景不多说,反正ndk加载gif比java上加载gif好很多很多,主要体现在内存占用与cpu消耗上.使用ndk加载占用内存更小,消耗的cpu更少. 要使用ndk加载 ...

  3. Android高工面试:用Glide加载Gif导致的卡顿,说一下你的优化思路

    前言 Glide图片框架是可以直接加载GIF图的,但是做一个银行合作项目的时候,由于有需要出货页面需要加载一个GIF图,但是发现在使用Glide框架加载Gif图片,明显发现有延迟. 经过查看glide ...

  4. kotlin Bean加载失败lateinit property has not been initialized

    Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creat ...

  5. Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存

    Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...

  6. tensorflow 1.x Saver(保存与加载模型) 预测

    20201231 tensorflow 1.X 模型保存 https://blog.csdn.net/qq_35290785/article/details/89646248 保存模型 saver=t ...

  7. tensor和模型 保存与加载 PyTorch

    PyTorch教程-7:PyTorch中保存与加载tensor和模型详解 保存和读取Tensor PyTorch中的tensor可以保存成 .pt 或者 .pth 格式的文件,使用torch.save ...

  8. 深度学习原理与框架-CNN在文本分类的应用 1.tf.nn.embedding_lookup(根据索引数据从数据中取出数据) 2.saver.restore(加载sess参数)...

    1. tf.nn.embedding_lookup(W, X) W的维度为[len(vocabulary_list), 128], X的维度为[?, 8],组合后的维度为[?, 8, 128] 代码说 ...

  9. Nignx集成fastDFS后访问Nginx一直在加载中解决

    问题描述: Nginx集成fastDFS后,访问Nginx一直在加载中,得不到页面.查看Nginx的错误日志: 可以看到是fastdfs.conf的配置错误,tracker的ip没有修改: fastd ...

最新文章

  1. c语言程序设计电大形考作业答案,2016年电大-电大c语言程序设计形成性考核册答案(-).doc...
  2. Ubuntu16.04 安装Gitlab
  3. UI设计素材|动画的妙处,有助于吸引你的用户
  4. php 位运算 负数,php的位运算详解
  5. 【免费下载】2021年4月热门报告盘点下载
  6. 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用...
  7. python执行request请求
  8. _beginThread如何传递多个参数
  9. 把书本上的字快速弄到电脑上
  10. node在Fedora 22系统下开发环境搭建
  11. cmd检查java_如何通过cmd查看java环境
  12. 微芯科技35.6亿美元购Atmel 芯片业整合潮继续
  13. python线性回归实例 x轴坐标相同_python深度学习-tensorflow实现一个线性回归的案例...
  14. 信号采样基本概念 —— 1. 冲激函数
  15. 【网络】内网访问外网和外网访问内网的原理
  16. 什么才算好的监控系统?
  17. 为什么word打字换行的时候突然上一行文字间距变大了?如图
  18. win mac 双系统 opencore 硬盘引导_一分钟组装Win+Mac通用移动固态硬盘,千万别忽略这个细节...
  19. 港科夜闻|香港科大冯雁教授专访:人工智能的发展不能脱离人本
  20. 修复IE不能正常上网的工具

热门文章

  1. 【企业】米聊败北案例
  2. 【随心记】Boosting算法随想
  3. miui开机慢android,游戏启动慢如蜗牛?最新ColorOS跟MIUI带来质的提升
  4. 各种窗口最小化快捷键详解
  5. 二分类Logistic回归模型
  6. android 读取usb 文件,android开发:手机连接电脑读取文件
  7. 基于ssm网页设计学习网站
  8. ikbc 时光机 F87 Ctrl 失灵 解决办法
  9. 起点终点未定的最短路径——ACM_HongKong D题
  10. 数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)