android使用giflib加载gif

转载请标明出处:http://77blogs.com/?p=211

背景不多说,反正ndk加载gif比java上加载gif好很多很多,主要体现在内存占用与cpu消耗上。使用ndk加载占用内存更小,消耗的cpu更少。

要使用ndk加载,需要用到giflib库,Android源代码里面其实也用到了这个库。

 

一、下载giflib

https://sourceforge.net/projects/giflib/

 

二、构建so库

1、把需要用到的代码拷贝进来

语法上就不多说了。

注意还需要用到log库和 jnigraphics库,一个是用来打印log,一个是用来图片解析的时候用到。

 

3、新建java类GifHandler,在里面新建本地方法,方便等会直接用快捷方式在native-lib里面生成

通过这些方法获取宽度,高度,帧数,渲染,打开文件。

 

4、native-lib代码,这里编写我们的本地代码

首先需要引进的头文件有:

<android/bitmap.h>NDK中带的头文件,解析图片要用到。

gif.h我们自己新建的头文件,等会讲

 

首先看openFile方法

这个方法主要是获取到GifFileType的指针地址。

 

GifFileType里面有gif文件的各种信息,定义在gif_lib.h里面。

 

从注释也可以看出具体的含义。

顺便说一下UserData,这个其实相当于tag,类似于可以给一个view  tag标识。

 

获取到到GifFileType之后便可以通过它获取宽度,高度,帧数,方法如下:

获取到相关信息后,我们就要进行渲染了。

先讲一下我们的原理,我们的原理是获取到信息。通过宽高构造一个bitmap,根据每一帧图片之间的间隔,拿这个bitmap去渲染,也就是通过这个延时时间循环去加载每一帧图片。

renderFrameN方法

AndroidBitmap_lockPixels(env, bitmap, &pixels)这个方法必须调用,它会锁定图片内存,同时呢,成功的话pixels会指向图片的地址。

相应的,下面就必须解除锁定:AndroidBitmap_unlockPixels(env, bitmap)

 

核心方法是这一句,当然这一句需要我们自定义头文件,也就是上面说到的gif.h

long delay_time = drawFrame(gifFileType, &info, (int *) pixels, index);

 

gif.h如下:

drawFrame方法如下,关于gif文件格式,可以自行百度,后面有空再写:


那么接下来就是主工程的调用了。

到此结束。

源码地址:https://github.com/TZHANHONG/GifLibSample

android的APT技术

转载请标明出处:http://77blogs.com/?p=199

APT 是Annotation Processing Tool 的简称。

它是注解处理器,在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成源文件和原来的源文件,将它们一起生成class文件。
简言之:APT可以根据注解,在编译时生成代码。

事实上它是javac的一个工具,命令行运行javac后便可以看到:

接下来我们就来实现一个apt的实例,类似于ButterKnife中@BindView注解,基本步骤如下:

1、定义要被处理的注解。

2、定义注解处理器(生成具体的类)。

3、调用处理器生成的代码

 

对应的,我们在工程中需要有这几个模块:

1、app。测试我们的功能

2、apt-annotation。一个Java library module,放置我们自定义注解

3、apt-processor。一个Java library module,注解处理器模块

4、apt-sdk。一个Android library module,通过反射调用apt-processor模块生成的方法,实现view的绑定。

工程目录如下:

1、在apt-annotation中自定义注解:

2、apt-processor中引入依赖,它需要依赖apt-annotation,同时还需要依赖auto-service第三方库,后面创建注解处理器的时候需要用到。

apt-processor/build.gradle文件中:

3、在pat-processor中创建注解处理器:

处理器需要继承AbstractProcessor,注意该module是 java module,如果创建的是android module的话那么就会找不到AbstractProcessor

需要注意的是代码中不能有中文,否则编译不通过,我这里为了方便注释解释加上了中文。

 

ClassCreatorFactory的代码如下,这个类负责提供需要写入新的类的代码:

先不谈apt-sdk模块,我们先来看看生成的代码是怎么样的。

在app的gradle中引入:

特别要注意的是apt-processor模块的依赖引进要用 annotationProcessor,否则编译报错

 

两个activity中:

rebuild一下便可以看到在这个目录下有我们生成的文件了。

gradle高版本出现编译后没出现文件的问题,无奈只好降低版本,我使用的版本是gradle  3.1.4 +  gralde_wrap  gradle-4.4-all.zip

点进入其中一个可以看到是这样的代码:

所以我们只要调用bindView就能够找到该view了,这也是apt-sdk要做的事情。

 

4、在apt-sdk中创建类,反射调用生成的类中的方法

5、app的gradle中引入apt-sdk,然后代码调用DataApi的方法

app的MainActivity中实现

这样就大功告成了

源码地址:https://github.com/TZHANHONG/AptAutoBindView