Android 中动画 GIF 的View
和Drawable
。
通过 JNI 捆绑的 GIFLib 用于渲染帧。这种方式应该比WebView
或Movie
类更有效。
将以下依赖项插入到项目的build.gradle
文件中。
依赖项{ 实现 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
请注意,Maven 中央存储库应定义为:在顶级build.gradle
中,如下所示:
构建脚本{ 存储库{ mavenCentral() } } 所有项目{ 存储库{ mavenCentral() } }
当前的开发版本(从dev
分支构建)已发布到 OSS 快照存储库。要使用它们,请在repositories
块中指定存储库 URL:
存储库{ mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } 依赖项{ 实现 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<依赖关系> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <版本>在此处插入最新版本</版本> <类型>aar</类型> </依赖>
请参阅带有设置说明的示例 eclipse 项目。
最新版本下载
Android 4.2+(API 级别 17+)
用于GifTextureView
硬件加速渲染
适用于GifTexImage2D
OpenGL ES 2.0+
编译原生源代码需要 Android NDK
请参阅sample
目录。样板工程正在建设中。尚未涵盖所有功能。
最简单的方法是像普通ImageView
一样使用GifImageView
(或GifImageButton
):
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:background="@drawable/bg_anim"/>
如果android:src
和/或android:background
声明的可绘制对象是 GIF 文件,那么它们将被自动识别为GifDrawable
并进行动画处理。如果给定的可绘制对象不是 GIF,那么提到的视图就像普通的ImageView
和ImageButton
一样工作。
GifTextView
允许您使用 GIF 作为复合绘图和背景。
<pl.droidsonroids.gif.GifTextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:drawableTop="@drawable/left_anim"android:drawableStart="@drawable/left_anim"android:background="@drawable/bg_anim ”/>
GifImageView
、 GifImageButton
和GifTextView
还实现了设置器的钩子。因此可以通过调用setImageResource(int resId)
和setBackgroundResource(int resId)
来设置动画GIF
GifDrawable
可以直接从各种来源构建:
//资源文件GifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //资源(可绘制或原始)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //对于 file:// UrisGifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri );//字节数组byte[] rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes ); 可以为 null //FileDescriptorFileDescriptor fd = new RandomAccessFile( "/path/anim.gif", "r" ).getFD();GifDrawable gifFromFd = new GifDrawable( fd ); //文件路径GifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //文件文件 gifFile = new File(getFilesDir(),"anim.gif");GifDrawable gifFromFile = new GifDrawable(gifFile); //AssetFileDescriptorAssetFileDescriptor afd = getAssets().openFd( "anim.gif" );GifDrawable gifFromAfd = new GifDrawable( afd ); //InputStream(必须支持标记)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //直接 ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
如果不再需要 GifDrawable,InputStreams 将在终结器中自动关闭,因此您无需显式关闭它们。调用recycle()
也会关闭底层输入源。
请注意,所有输入源都需要能够倒回到开头。需要正确播放动画 GIF(其中动画是可重复的),因为后续帧是根据源的需要进行解码的。
GifDrawable
实现了Animatable
和MediaPlayerControl
因此您可以使用它的方法和更多功能:
stop()
- 停止动画,可以从任何线程调用
start()
- 启动动画,可以从任何线程调用
isRunning()
- 返回动画当前是否正在运行
reset()
- 倒带动画,不重新启动停止的动画
setSpeed(float factor)
- 设置新的动画速度因子,例如。通过 2.0f 将使动画速度加倍
seekTo(int position)
- 寻找动画(在当前循环内)到给定position
(以毫秒为单位)
getDuration()
- 返回动画一个循环的持续时间
getCurrentPosition()
- 返回从当前动画循环开始起经过的时间
MediaPlayer 的标准控件(如 VideoView 中)可用于控制 GIF 动画并显示其当前进度。
只需将GifDrawable
设置为 MediaController 上的 MediaPlayer,如下所示:
@Overrideprotected void onCreate(Bundle savingInstanceState) {super.onCreate(savedInstanceState);GifImageButton gib = new GifImageButton(this);setContentView(gib);gib.setImageResource(R.drawable.sample);final MediaController mc = new MediaController(this) ;mc.setMediaPlayer((GifDrawable) gib.getDrawable());mc.setAnchorView(gib);gib.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mc.show(); } }); }
getLoopCount()
- 返回NETSCAPE 2.0
扩展中定义的循环计数
getNumberOfFrames()
- 返回帧数(至少 1)
getComment()
- 返回注释文本(如果 GIF 没有注释则null
)
getFrameByteCount()
- 返回可用于存储单帧像素的最小字节数
getAllocationByteCount()
- 返回用于存储给定 GifDrawable 像素的已分配内存的大小(以字节为单位)
getInputSourceByteCount()
- 返回支持输入数据的长度(以字节为单位)
toString()
- 返回有关图像大小和帧数的人类可读信息(用于调试目的)
GifDrawable
实例与多个View
关联通常,与多个View
关联的单个GifDrawable
实例将仅在最后一个上设置动画。要解决创建MultiCallback
实例的问题,请向其中添加View
并为给定的可绘制对象设置回调,例如:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
请注意,如果您更改ImageView
等可绘制对象,则回调将从之前的可绘制对象中删除。此后,您必须重新分配回调,否则同一个GifDrawable
实例将停止动画。有关更多信息,请参阅#480。
recycle()
- 提供加速释放内存(如android.graphics.Bitmap
)
isRecycled()
- 检查drawable是否被回收
getError()
- 返回最后一个错误详细信息
最低 API 级别现在为 17 (Android 4.2)。不再支持armeabi
(arm v5 和 v6)。
最低 API 级别现在为 14 (Android 4.0)。
仅当不使用消费者混淆规则(与库捆绑)时才有意义(Gradle 默认使用它们)。
Proguard 规则已更改为-keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
1.1.17 是支持 API 级别 8 (Froyo) 的最后一个版本。从 1.2.0 开始,最低 API 级别为 9(Gingerbread)。
一些边缘情况的处理已更改:
当GifDrawable
被回收时, GifDrawable#getNumberOfFrames()
现在返回 0
当GifDrawable
被回收时, GifDrawable#toString()
结果中包含的信息现在仅包含零
建议(但不要求)在使用GifDrawable
之前调用LibraryLoader.initialize()
。在某些无法正常提取本机库的情况下,需要Context
。有关更多详细信息,请参阅重新链接器。如果未调用LibraryLoader.initialize()
并且正常的库加载失败,将尝试以回退方式检索Context
,但这可能并不总是有效。
int
参数loopNumber
已添加到AnimationListener#onAnimationCompleted()
。
Proguard 配置现在与库捆绑在一起,您不需要自己指定它。
GifTextureView
中的src
XML 属性已重命名为gifSource
以避免与其他库可能发生冲突。
Proguard 配置已更改为:
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
现在使用android.graphics.Bitmap
作为帧缓冲区。尝试访问回收的GifDrawable
的像素(包括绘图)将导致IllegalStateException
就像Bitmap
中一样。
最低 API 级别现在为 8 (Android 2.2)。
渲染是在独立于主线程运行的后台线程中执行的,因此即使未绘制可绘制对象,动画也会运行。但是,如果drawable不可见,则渲染不会运行,请参阅[#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean))。当 Android 框架尚未处理可绘制对象时,该方法可用于控制可绘制对象的可见性。
该库使用 GIFLib 5.1.3 和 SKIA 的代码。
图像工厂
Brad Martin 的 NativeScript 插件可在 NPM 上使用
Sketch Android 上强大且全面的图像加载器,支持 GIF、手势缩放、块显示超大图像。
想在这里包含您的项目吗?填写问题
麻省理工学院许可证
请参阅许可证文件。