我想在我的应用程序中显示动画GIF图像 . 正如我发现的那样,Android本身并不支持动画GIF .
但是它可以使用AnimationDrawable显示动画:
Develop > Guides > Images & Graphics > Drawables Overview
该示例使用在应用程序资源中保存为帧的动画,但我需要的是直接显示动画gif .
我的计划是将动画GIF分解为帧并将每个帧添加为可绘制到AnimationDrawable .
有谁知道如何从动画GIF中提取帧并将它们转换为Drawable?
29 回答
UPDATE:
使用滑行:
用法:
见文档
Android实际上可以使用android.graphics.Movie类解码和显示动画GIF .
这没有太多记录,但是在SDK Reference . 此外,它在Samples in ApiDemos in BitmapDecode示例中使用了一些动画标志 .
也把(main / assets / htmls / name.gif)[用这个html调整到大小]
在你的Xml中声明例如这样(main / res / layout / name.xml):[你定义大小,例如]
在您的Activity中将下一个代码放在onCreate中
如果要动态加载,则必须使用数据加载webview:
建议:更好的加载gif与静态图像更多信息检查https://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html
就是这样,我希望你能提供帮助 .
我通过将 gif 动画分割成帧然后将其保存到手机来解决了这个问题,所以我不必在Android中处理它 .
然后我将每一帧下载到手机上,从中创建Drawable然后创建 AnimationDrawable - 非常类似于我的问题中的示例
我找到了一个非常简单的方法,这里有一个简单的工作示例
display animated widget
在开始工作之前,在代码中有一些要做的事情
在下面的
只是替换
在
和IN
提供您自己的gif动画文件
取代第一线
根据 class 名称......
完成这些小改动之后它应该对我有用......
希望这个帮助
在Android上显示动画GIF的方法:
电影课 . 如上所述,它是相当错误的 .
WebView . 它使用起来非常简单并且通常有效 . 但有时它开始行为不端,而且它已经开始行动了 . 此外,您不能在任何类型的列表视图中使用多个实例,因为它会对您的内存起作用 . 不过,您可能会将其视为主要方法 .
自定义代码,用于将GIF解码为位图并将其显示为Drawable或ImageView . 我会提到两个库:
https://github.com/koral--/android-gif-drawable - 解码器在C中实现,因此它非常有效 .
https://code.google.com/p/giffiledecoder - 解码器是用Java实现的,因此更容易使用 . 即使对于大文件,仍然相当有效 .
您还可以找到许多基于GifDecoder类的库 . 这也是一个基于Java的解码器,但它的工作原理是将整个文件加载到内存中,因此它只适用于小文件 .
我很难让Android动画gif工作 . 我只跟着两个工作:
WebView
Ion
WebView工作正常,非常简单,但问题是它使视图加载速度变慢,应用程序在一秒左右没有响应 . 我不喜欢那样 . 所以我尝试了不同的方法(DID NOT WORK):
ImageViewEx已弃用!
picasso未加载GIF动画
android-gif-drawable看起来很棒,但它在我的项目中引起了一些有线NDK问题 . 它导致我的本地NDK库停止工作,我无法修复它
我有一些来回
Ion
;最后,我有它工作,它真的很快:-)使用ImageViewEx,一个使用gif的库就像使用_1212041一样简单 .
Glide
适用于Android的Image Loader Library,由Google推荐 .
Glide与毕加索非常相似,但这比毕加索要快得多 .
Glide比毕加索消耗的内存更少 .
What that Glide has but Picasso doesn't
将GIF动画加载到简单的ImageView的功能可能是Glide最有趣的功能 . 是的,你不能用毕加索做到这一点 .
Some important links-
https://github.com/bumptech/glide
http://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
没人提到Ion或Glide库 . 他们工作得很好 .
与WebView相比,它更容易处理 .
我已经成功地提出了within this article这个名为
GifMovieView
的类的解决方案,该类渲染了View
然后可以显示或者添加到特定的ViewGroup
. 查看指定文章第2部分和第3部分中介绍的其他方法 .这种方法的唯一缺点是对电影的抗锯齿效果不是那么好(必须是使用"shady" Android
Movie
类的副作用) . 然后,最好在动画GIF中将背景设置为纯色 .试试这个,下面是代码显示进度条中的gif文件
loading_activity.xml(在布局文件夹中)
custom_loading.xml(在drawable文件夹中)
在这里我把black_gif.gif(在drawable文件夹中),你可以把你自己的gif放在这里
LoadingActivity.java(在res文件夹中)
关于BitmapDecode示例的一些想法......基本上它使用了android.graphics中的古老而无特征的Movie类 . 在最近的API版本中,您需要关闭硬件加速,as described here . 否则,这对我来说是分段的 .
这是仅使用GIF部分缩短的BitmapDecode示例 . 你必须制作自己的小工具(视图)并自己绘制 . 不像ImageView那么强大 .
另外2个方法,一个用ImageView另一个用WebView可以在this fine tutorial中找到 . ImageView方法使用来自Google Code的Apache许可android-gifview .
@PointerNull提供了很好的解决方案,但并不完美 . 它在某些具有大文件的设备上不起作用,并且在前ICS版本上显示带有增量帧的错误Gif动画 . 我找到了没有这个错误的解决方案 . 它是具有原生解码的库,可绘制:koral's android-gif-drawable .
将它放入WebView,它必须能够正确显示它,因为默认浏览器支持gif文件 . (Froyo,如果我没有记错的话)
Glide 4.6
1. To Load gif
2. To get the file object
仅适用于Android API(Android Pie)28和
使用AnimatedImageDrawable作为
XML代码,添加一个ImageView
AnimatedImageDrawable
是Drawable的子项,由ImageDecoder.decodeDrawable
创建ImageDecoder.decodeDrawable
进一步需要ImageDecoder.createSource
创建的ImageDecoder.Source
实例 .ImageDecoder.createSource
只能将source作为名称,ByteBuffer,File,resourceId,URI,ContentResolver来创建源对象并使用它来创建AnimatedImageDrawable
作为Drawable
(多态调用)注意:您也可以使用ImageDecoder#decodeBitmap创建
Bitmap
.输出:
AnimatedDrawable also supports resizing, frame and color manipulation
我认为处理gif文件的更好的库是this one: by koral
用它和我'm successful and this library is dedicated to GIF' S;但是 picasso and glide 是 general purpose 图像框架;所以我认为这个库的开发人员完全专注于gif文件
使用壁画 . 这是怎么做的:
http://frescolib.org/docs/animations.html
这是样本的回购:
https://github.com/facebook/fresco/tree/master/samples/animation
当心壁画不支持包装内容!
只想添加Movie类现已弃用 .
建议使用它
AnimatedImageDrawable
您可以使用此链接中的GifAnimationDrawable库 - https://github.com/Hipmob/gifanimateddrawable,并将任何gif转换为AnimationDrawable . 请享用 :)
将动画GIF加载到我们的Android应用程序有两种选择
1)使用Glide将gif加载到
ImageView
中 .2)使用html将gif加载到
WebView
中使用.gif文件的地址创建html:
将此文件存储到assets目录中:
将此html加载到应用程序的WebView中:
赫雷斯是complete example of this two options .
首先,Android浏览器应支持动画GIF . 如果没有,那就是一个错误!看看问题跟踪器 .
如果您在浏览器之外显示这些动画GIF,则可能是另一个故事 . 要做你想要的就需要支持动画GIF解码的外部库 .
第一个调用端口是查看Java2D或JAI(Java高级成像)API,但如果Android Dalvik支持您应用程序中的这些库,我会感到非常惊讶 .
与@Leonti所说的相似,但更深入一点:
我为解决同样的问题所做的是打开GIMP,隐藏除了一个之外的所有层,将其导出为自己的图像,然后隐藏该层并取消隐藏下一个等等,直到我为每个层都有单独的资源文件 . 然后我可以将它们用作AnimationDrawable XML文件中的框架 .
我通过在框架中拆分gif并使用标准的android动画来解决这个问题
我为在应用程序中显示GIF而做的事情 . 我扩展了ImageView,以便人们可以自由使用它的属性 . 它可以显示来自url或assets目录的gif . 该库还使扩展类很容易从它继承并扩展它以支持不同的方法来初始化gif .
https://github.com/Gavras/GIFView
还有一点github页面上的指南 .
它也发布在Android阿森纳:
https://android-arsenal.com/details/1/4947
使用示例:
来自XML:
在活动中:
以编程方式设置gif:
最简单的方法 - 可以考虑以下代码
我们可以利用Imageview setImageResource,参考下面的代码相同 .
如果你有gif的多个分割图像,下面的代码可用于显示像gif incase的图像 . 只需将gif从在线工具拆分为单独的png,然后将图像放入drawable中,如下所示
image_1.png,image_2.png等
让处理程序动态更改图像 .
直接从URL到应用程序布局显示动画GIF的简单方法是使用WebView类 .
第1步: In your layout XML
第2步: In your Activity
第3步: In your Manifest.XML make Internet permission
第4步: In case you want to make your GIF background transparent and make GIF fit to your Layout