我想在我的应用程序中显示动画GIF图像。 我发现Android本身并不支持GIF动画。
但是它可以使用AnimationDrawable显示动画:
开发>指南>图像和图形>绘图概述
这个例子使用动画保存为框架的应用程序资源,但我需要的是直接显示动画gif。
我的计划是将动画GIF分解为帧,并将每帧添加为可绘制的AnimationDrawable。
有人知道如何从动画GIF中提取帧并将它们转换为可绘制的吗?
我想在我的应用程序中显示动画GIF图像。 我发现Android本身并不支持GIF动画。
但是它可以使用AnimationDrawable显示动画:
开发>指南>图像和图形>绘图概述
这个例子使用动画保存为框架的应用程序资源,但我需要的是直接显示动画gif。
我的计划是将动画GIF分解为帧,并将每帧添加为可绘制的AnimationDrawable。
有人知道如何从动画GIF中提取帧并将它们转换为可绘制的吗?
当前回答
最简单的方法-可以考虑下面的代码
我们可以利用Imageview的setImageResource,参考下面的代码相同。
下面的代码可以用来显示像gif一样的图像,如果你有gif的多次分割图像。只需从在线工具中将gif分割成单独的png,并按照以下顺序将图像放入可绘制图中
Image_1.png, image_2.png等等。
让处理程序动态地更改图像。
int imagePosition = 1;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
updateImage();
}
};
public void updateImage() {
appInstance.runOnUiThread(new Runnable() {
@Override
public void run() {
int resId = getResources().getIdentifier("image_" + imagePosition, "drawable", appInstance.getPackageName());
gifImageViewDummy.setImageResource(resId);
imagePosition++;
//Consider you have 30 image for the anim
if (imagePosition == 30) {
//this make animation play only once
handler.removeCallbacks(runnable);
} else {
//You can define your own time based on the animation
handler.postDelayed(runnable, 50);
}
//to make animation to continue use below code and remove above if else
// if (imagePosition == 30)
//imagePosition = 1;
// handler.postDelayed(runnable, 50);
//
}
});
}
其他回答
如果你想使用Glide加载gif:
Glide.with(this)
.asGif()
.load(R.raw.onboarding_layers) //Your gif resource
.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
.listener(new RequestListener<GifDrawable>() {
@Override
public boolean onLoadFailed(@Nullable @org.jetbrains.annotations.Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
resource.setLoopCount(1);
return false;
}
})
.into((ImageView) view.findViewById(R.id.layer_icons));
直接从URL到应用程序布局显示动画GIF的简单方法是使用WebView类。
步骤1: 在XML布局中
< WebView android: id =“@ + id / webView” android: layout_width = " 50 dp” android: layout_height = " 50 dp” />
第二步:在活动中
网络视图 wb; wb = (WebView) findViewById(R.id.webView); wb.loadUrl(“https://.......);
步骤3:在Manifest.XML中设置Internet权限
< uses-permission android: name = " android.permission。互联网" / >
步骤4:如果你想让你的GIF背景透明,让GIF适合你的布局
wb.setBackgroundColor (Color.TRANSPARENT); wb.getSettings () .setLoadWithOverviewMode(真正的); wb.getSettings () .setUseWideViewPort(真正的);
用壁画。以下是如何做到这一点:
http://frescolib.org/docs/animations.html
以下是示例的回购:
https://github.com/facebook/fresco/tree/master/samples/animation
当心壁画不支持包装内容!
我找到了一个非常简单的方法,这里有一个很好的简单的工作例子
显示动画小部件
在让它工作之前,在代码中有一些更改要做
在下面
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceStated);
setContentView(new MYGIFView());
}
}
只是替换
setContentView(new MYGIFView());
in
setContentView(new MYGIFView(this));
而在
public GIFView(Context context) {
super(context);
提供您自己的gif动画文件
is = context.getResources().openRawResource(R.drawable.earth);
movie = Movie.decodeStream(is);
}
替换第一行
public MYGIFView(Context context) {
根据课程名称…
在做了这个小改变后,它应该为我工作…
希望这对你有所帮助
首先,Android浏览器应该支持动画gif。如果没有,那就是bug!看一下问题跟踪器。
如果你在浏览器外显示这些动画gif,情况可能就不一样了。要做到你所要求的,将需要外部库,支持动画gif解码。
第一个接口是Java2D或JAI (Java Advanced Imaging) API,如果Android Dalvik在你的应用程序中支持这些库,我会感到非常惊讶。