
Views and Drawable for animated GIFs in Android.
Bundled GIFLib via JNI is used to render frames. This way should be more efficient than WebView or Movie classes.
Insert the following dependency to build.gradle file of your project.
dependencies { implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.29' }
Note that Maven central repository should be defined eg. in top-level build.gradle like this:
buildscript { repositories { mavenCentral() } } allprojects { repositories { mavenCentral() } }
Current development builds (build from dev branch) are published to OSS snapshot repository. To use them, specify repository URL in repositories block:
repositories { mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } dependencies { implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.+' }
<dependency> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <version>insert latest version here</version> <type>aar</type> </dependency>
See Sample eclipse project with setup instructions.
GifTextureView hardware-accelerated renderingGifTexImage2D OpenGL ES 2.0+See sample directory. Sample project is under construction. Not all features are covered yet.
The simplest way is to use GifImageView (or GifImageButton) like a normal ImageView:
<pl.droidsonroids.gif.GifImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/src_anim" android:background="@drawable/bg_anim" />
If drawables declared by android:src and/or android:background are GIF files then they
will be automatically recognized as GifDrawables and animated. If given drawable is not a GIF then
mentioned Views work like plain ImageView and ImageButton.
GifTextView allows you to use GIFs as compound drawables and background.
<pl.droidsonroids.gif.GifTextView android: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 and GifTextView have also hooks for setters implemented. So animated GIFs can be set by calling setImageResource(int resId) and setBackgroundResource(int resId)
GifDrawable can be constructed directly from various sources:
//asset file GifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //resource (drawable or raw) GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //Uri ContentResolver contentResolver = ... //can be null for file:// Uris GifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri ); //byte array byte[] rawGifBytes = ... GifDrawable gifFromBytes = new GifDrawable( rawGifBytes ); //FileDescriptor FileDescriptor fd = new RandomAccessFile( "/path/anim.gif", "r" ).getFD(); GifDrawable gifFromFd = new GifDrawable( fd ); //file path GifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //file File gifFile = new File(getFilesDir(),"anim.gif"); GifDrawable gifFromFile = new GifDrawable(gifFile); //AssetFileDescriptor AssetFileDescriptor afd = getAssets().openFd( "anim.gif" ); GifDrawable gifFromAfd = new GifDrawable( afd ); //InputStream (it must support marking) InputStream sourceIs = ... BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH ); GifDrawable gifFromStream = new GifDrawable( bis ); //direct ByteBuffer ByteBuffer rawGifBytes = ... GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
InputStreams are closed automatically in finalizer if GifDrawable is no longer needed
so you don't need to explicitly close them. Calling recycle() will also close
underlying input source.
Note that all input sources need to have ability to rewind to the beginning. It is required to correctly play animated GIFs (where animation is repeatable) since subsequent frames are decoded on demand from source.
GifDrawable implements an Animatable and MediaPlayerControl so you can use its methods and more:
stop() - stops the animation, can be called from any threadstart() - starts the animation, can be called from any threadisRunning() - returns whether animation is currently running or notreset() - rewinds the animation, does not restart stopped onesetSpeed(float factor) - sets new animation speed factor, eg. passing 2.0f will double the animation speedseekTo(int position) - seeks animation (within current loop) to given position (in milliseconds)getDuration() - returns duration of one loop of the animationgetCurrentPosition() - returns elapsed time from the beginning of a current loop of animationStandard controls for a MediaPlayer (like in VideoView) can be used to control GIF animation and show its current progress.
Just set GifDrawable as MediaPlayer on your MediaController like this:
@Override protected void onCreate(Bundle savedInstanceState) { 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() { @Override public void onClick(View v) { mc.show(); } }); }
getLoopCount() - returns a loop count as defined in NETSCAPE 2.0 extensiongetNumberOfFrames() - returns number of frames (at least 1)getComment() - returns comment text (null if GIF has no comment)getFrameByteCount() - returns minimum number of bytes that can be used to store pixels of the single framegetAllocationByteCount() - returns size (in bytes) of the allocated memory used to store pixels of given GifDrawablegetInputSourceByteCount() - returns length (in bytes) of the backing input datatoString() - returns human readable information about image size and number of frames (intended for debugging purpose)GifDrawable instance with multiple ViewsNormally single GifDrawable instance associated with multiple Views will animate only on the last one.
To solve that create MultiCallback instance, add Views to it and set callback for given drawable, e.g.:
MultiCallback multiCallback = new MultiCallback(); imageView.setImageDrawable(gifDrawable); multiCallback.addView(imageView); anotherImageView.setImageDrawable(gifDrawable); multiCallback.addView(anotherImageView); gifDrawable.setCallback(multiCallback);
Note that if you change a drawable of e.g. ImageView, the callback will be removed from the previous
drawable. Thereafter, you have to reassign callback or the same GifDrawable instance will stop animating.
See #480 for more information.
recycle() - provided to speed up freeing memory (like in android.graphics.Bitmap)isRecycled() - checks whether drawable is recycledgetError() - returns last error detailsMinimum API level is now 17 (Android 4.2).
armeabi (arm v5 and v6) is no longer supported.
Minimum API level is now 14 (Android 4.0).
Meaningful only if consumer proguard rules (bundled with library) are not used (they are used by default by Gradle).
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}1.1.17 is the last version supporting API level 8 (Froyo). Starting from 1.2.0 minimum API level is 9 (Gingerbread).
Handling of several edge cases has been changed:
GifDrawable#getNumberOfFrames() now returns 0 when GifDrawable is recycledGifDrawable#toString() when GifDrawable is recycled now contains zeroes onlyIt is recommended (but not required) to call LibraryLoader.initialize() before using GifDrawable. Context is needed in some cases
when native libraries cannot be extracted normally. See ReLinker
for more details.
If LibraryLoader.initialize() was not called and normal library loading fails, Context will be tried to be retrieved in fall back way which may not always work.
int parameter loopNumber has been added to AnimationListener#onAnimationCompleted().
Proguard configuration is now bundled with the library, you don't need to specify it yourself.
src XML attribute in GifTextureView has been renamed to gifSource to avoid possible conflicts with other libraries.
Proguard configuration has changed to:
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);}
-keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable now uses android.graphics.Bitmap as frame buffer. Trying to access pixels (including drawing)
of recycled GifDrawable will cause IllegalStateException like in Bitmap.
Minimum API level is now 8 (Android 2.2).
Rendering is performed in background thread running independently from main thread so animation is running even if drawable is not drawn. However rendering is not running if drawable is not visible, see [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). That method can be used to control drawable visibility in cases when it is not already handled by Android framework.
This library uses code from GIFLib 5.1.3 and SKIA.
NativeScript Plugin by Brad Martin available on NPM
Sketch Powerful and comprehensive image loader on Android, with support for GIF, gesture zooming, block display super large image.
Want to include your project here? Fill an issue
MIT License<br> See LICENSE


全球首个AI音乐社区
音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。


阿里Qoder团队推出的桌面端AI智能体
QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。


一站式搞定所有学习需求
不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。


为AI短剧协作而生
专为AI短剧协作而生 的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。


能听懂你表达的视频模型
Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。


国内直接访问,限时3折
输入简单文字,生成想要的图片,纳米香蕉中文站基于 Google 模型的 AI 图片生成网站,支持文字生图、图生图。官网价格限时3折活动


职场AI,就用扣子
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!


多风格AI绘画神器
堆友平台由阿里巴巴设计团队创建,作为一款AI驱动 的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。


零代码AI应用开发平台
零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号