我想在我的应用程序中显示动画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);
// 
                    }
                });
              }

其他回答

有两个选项可以将动画gif加载到我们的Android应用程序中

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>

将这个文件存储到assets目录中:

将这个html加载到应用程序的WebView中:

    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+,如果我没记错的话)

关于BitmapDecode例子的一些想法…基本上,它使用了来自android.graphics的古老但毫无特色的Movie类。 在最新的API版本中,您需要关闭硬件加速,如下所述。这是segfaulting对我来说,否则。

<activity
            android:hardwareAccelerated="false"
            android:name="foo.GifActivity"
            android:label="The state of computer animation 2014">
</activity>

下面是BitmapDecode的例子,只缩短了GIF部分。你必须自己制作小部件(视图)并自己绘制。不如ImageView强大。

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();
            }
        }
    }
}

2其他方法,一个用ImageView另一个用WebView可以在这个教程中找到。ImageView方法使用Apache从谷歌代码授权的android-gifview。

为了节省资源,有滑翔库。 不知道为什么要使用其他任何东西,特别是webview只显示图像。 Glide是一个完美而简单的库,它可以从gif中准备动画,并将其直接放到imageview中。 gifdrawable句柄动画本身的逻辑。 Gif有lzw压缩原始rgb数据的动画里面。 没有理由复杂的使用webview和管理更多的文件,只显示一个gif文件在应用程序。

类似于@Leonti说的,但更有深度:

为了解决同样的问题,我所做的是打开GIMP,隐藏除一个层之外的所有层,将其导出为其自己的图像,然后隐藏该层并取消隐藏下一个层,等等,直到每个层都有单独的资源文件。然后我可以在AnimationDrawable XML文件中使用它们作为框架。