如何从android中的url播放动画GIF图像?

时间:2014-11-03 10:19:39

标签: android image animation gif giphy

我正在将giphy集成到我的Android应用程序中..

如何从android中的URL播放animated gif图片?我应该使用ImageView, WebView, VideoView等吗?例如,如果我想从this URL播放动画。

4 个答案:

答案 0 :(得分:2)

只需创建一个html字符串并将其加载到android webview中。经过测试的解决方案。

http://developer.android.com/reference/android/webkit/WebView.html#loadData(java.lang.String,java.lang.String,java.lang.String)

 String x = "<!DOCTYPE html><html><body><img src=\"http://goo.gl/uPJ9P2\" alt=\"Smileyface\" width=\"100%\" height=\"100%\"></body></html>";

 webView.loadData(x, "text/html", "utf-8");   

答案 1 :(得分:1)

试试这种方式

    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 :(得分:1)

我建议使用支持GIF的Glide等第三方库。

我制作了一个快速示例应用,用于显示Giphy的API here中的GIF。

希望有所帮助

答案 3 :(得分:0)

该解决方案的一般草图是使用雇佣自定义视图,该视图绘制要求电影定期将自己绘制到画布。

第一步是构建Movie实例。有一个名为decodeStream的工厂可以使用InputStream制作电影但是使用来自UrlConnection的流是不够的。如果您尝试这样做,当电影加载程序尝试在流上调用reset时,您将收到IOException。不幸的是,hack是使用带有手动设置标记的分离的BufferedInputStream来告诉它保存足够的数据,重置不会失败。幸运的是,URLConnection可以告诉我们预计会有多少数据。我说这个hack是不幸的,因为它实际上需要将整个映像缓存在内存中(对于桌面应用来说这不是问题,但在内存受限的移动设备上这是一个严重的问题)。

以下是电影设置代码的片段:

URL url = new URL(gifSource);
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bis.mark(conn.getContentLength());
Movie movie = Movie.decodeStream(bis);
bis.close();

接下来,您需要创建一个将显示此影片的视图。具有自定义onDraw的View的子类将起作用(假设它可以访问您使用前面的代码创建的电影)。

@Override protected void onDraw(Canvas canvas) {
    if(movie != null) {
        long now = android.os.SystemClock.uptimeMillis();
        int dur = Math.max(movie.duration(), 1); // is it really animated?
        int pos = (int)(now % dur);
        movie.setTime(pos);
        movie.draw(canvas, x, y);
    }
}

视图不会在没有帮助的情况下触发自身重绘,并且在onDraw结束时盲目调用invalidate()只是一种能量浪费。在另一个线程(可能是您用来下载图像数据的线程)中,您可以将消息发布到主线程,要求视图以稳定(但不是疯狂)的速度失效。

Handler handler = new Handler();
new Thread() {
    @Override public void run() {
        // ... setup the movie (using the code from above)
        // ... create and display the custom view, passing the movie

        while(!Thread.currentThread().isInterrupted()) {
            handler.post(new Runnable() {
                public void run(){
                    view.invalidate();
                }
            });
            try {
                Thread.sleep(50); // yields 20 fps
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}.start();

希望它能帮助您理解