我想在我的应用程序中显示动画GIF图像。但很遗憾,Android不支持原生的动画GIF。
不过,Android可以使用AnimationDrawable来显示动画:
示例使用应用程序资源中保存为帧的动画,但我需要直接显示动画GIF。
我的计划是将动画GIF拆分为帧并将每个帧作为drawable添加到AnimationDrawable中。
有人知道如何从动画GIF中提取帧,并将每个帧转换为Drawable吗?
我想在我的应用程序中显示动画GIF图像。但很遗憾,Android不支持原生的动画GIF。
不过,Android可以使用AnimationDrawable来显示动画:
示例使用应用程序资源中保存为帧的动画,但我需要直接显示动画GIF。
我的计划是将动画GIF拆分为帧并将每个帧作为drawable添加到AnimationDrawable中。
有人知道如何从动画GIF中提取帧,并将每个帧转换为Drawable吗?
使用ImageViewEx库,这个库可以把使用GIF动图变得像使用ImageView
一样简单。
GifMovieView
的类来呈现一个View
,该视图可以显示或添加到特定的ViewGroup
中。请查看指定文章的第2部分和第3部分中介绍的其他方法。Movie
类的副作用)。因此,最好将动画GIF的背景设置为纯色。关于BitmapDecode示例的一些想法...基本上它使用了来自android.graphics的古老但功能相对简单的Movie类。在最近的API版本中,您需要关闭硬件加速,如此处所述。否则,它会导致段错误。
<activity
android:hardwareAccelerated="false"
android:name="foo.GifActivity"
android:label="The state of computer animation 2014">
</activity>
import android.app.Activity;
import android.content.Context;
import android.graphics.*;
import android.os.*;
import android.view.View;
public class GifActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new GifView(this));
}
static class GifView extends View {
Movie movie;
GifView(Context context) {
super(context);
movie = Movie.decodeStream(
context.getResources().openRawResource(
R.drawable.some_gif));
}
@Override
protected void onDraw(Canvas canvas) {
if (movie != null) {
movie.setTime(
(int) SystemClock.uptimeMillis() % movie.duration());
movie.draw(canvas, 0, 0);
invalidate();
}
}
}
}
还有两种方法可以实现动态图的显示,一种是使用ImageView,另一种是使用WebView,详细信息请参见这篇优秀教程。ImageView方法使用了来自Google Code的Apache许可的android-gifview。
@PointerNull提供了一个好的解决方案,但它并不完美。在一些设备上无法处理大文件,并且在Android 4.0之前的版本中显示带有增量帧的Gif动画时会出现错误。 我找到了一个没有这些问题的解决方法。这是一个具有本地解码功能的库,可以将其转换为可绘制对象:koral's android-gif-drawable。
// ImageView from layout
val ima : ImageView = findViewById(R.id.img_gif)
// create AnimatedDrawable
val decodedAnimation = ImageDecoder.decodeDrawable(
// create ImageDecoder.Source object
ImageDecoder.createSource(resources, R.drawable.tenor))
// set the drawble as image source of ImageView
ima.setImageDrawable(decodedAnimation)
// play the animation
(decodedAnimation as? AnimatedImageDrawable)?.start()
XML代码,添加一个ImageView
<ImageView
android:id="@+id/img_gif"
android:background="@drawable/ic_launcher_background" <!--Default background-->
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="200dp"
android:layout_height="200dp" />
AnimatedImageDrawable
是Drawable的子类,由ImageDecoder.decodeDrawable
创建。
ImageDecoder.decodeDrawable
需要ImageDecoder.Source
实例,该实例由ImageDecoder.createSource
创建。
ImageDecoder.createSource
只能使用名称、ByteBuffer、文件、资源ID、URI、ContentResolver作为源来创建源对象,并将其用于创建AnimatedImageDrawable
作为Drawable
(多态调用)。
static ImageDecoder.Source createSource(AssetManager assets, String fileName)
static ImageDecoder.Source createSource(ByteBuffer buffer)
static ImageDecoder.Source createSource(File file)
static ImageDecoder.Source createSource(Resources res, int resId)
static ImageDecoder.Source createSource(ContentResolver cr, Uri uri)
Bitmap
。在我们的Android应用程序中加载动态GIF有两种选择:
1)使用Glide将GIF加载到ImageView
中。
String urlGif = "https://cdn.dribbble.com/users/263558/screenshots/1337078/dvsd.gif";
//add Glide implementation into the build.gradle file.
ImageView imageView = (ImageView)findViewById(R.id.imageView);
Uri uri = Uri.parse(urlGif);
Glide.with(getApplicationContext()).load(uri).into(imageView);
2) 使用html将gif加载到WebView
中
创建包含.gif文件地址的html:
<html style="margin: 0;">
<body style="margin: 0;">
<img src="https://..../myimage.gif" style="width: 100%; height: 100%" />
</body>
</html>
将此文件存储到资产目录中:
然后在您的应用程序的WebView中加载此html:
WebView webView = (WebView)findViewById(R.id.webView);
webView = (WebView) findViewById(R.id.webView);
webView.loadUrl("file:///android_asset/html/webpage_gif.html");
将其放入WebView中,必须能够正确显示它,因为默认浏览器支持gif文件。(如果我没记错的话,是Froyo+)
我认为处理gif文件的更好的库是 koral。
我使用过它并且成功了,这个库专门用于GIF'S;而picasso和glide是通用的图像框架;因此我认为这个库的开发者完全集中在gif文件上。
Use fresco. Here's how to do it:
http://frescolib.org/docs/animations.html
这里是带有样例的代码库:https://github.com/facebook/fresco/tree/master/samples/animation
注意,Fresco不支持自适应内容!