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

如何在android中从url播放动画GIF图像?,android,image,animation,gif,giphy,Android,Image,Animation,Gif,Giphy,我正在将giphy集成到我的android应用程序中 如何在android中播放URL中的动画gif图像?我应该使用ImageView、WebView、VideoView等吗?例如,如果我想从URL播放动画。只需创建一个html字符串并将其加载到android webview中。测试溶液 ,java.lang.String,java.lang.String) String x=”“; loadData(x,“text/html”、“utf-8”); 只需创建一个html字符串并将其加载到andr

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


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

只需创建一个html字符串并将其加载到android webview中。测试溶液

,java.lang.String,java.lang.String)

String x=”“;
loadData(x,“text/html”、“utf-8”);

只需创建一个html字符串并将其加载到android webview中即可。测试溶液

,java.lang.String,java.lang.String)

String x=”“;
loadData(x,“text/html”、“utf-8”);
试试这种方法

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

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

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

第一步是构建电影实例。有一个名为decodeStream的工厂,它可以在给定InputStream的情况下制作电影,但仅使用URL连接中的流是不够的。如果您尝试此操作,当电影加载程序尝试调用流上的重置时,您将得到一个IOException。不幸的是,黑客使用了一个单独的BufferedInputStream,并带有一个手动设置的标记,告诉它保存足够的数据,以便重置不会失败。幸运的是,URLConnection可以告诉我们需要多少数据。我说这种黑客行为是不幸的,因为它实际上需要将整个图像缓冲在内存中(这对于桌面应用程序来说没有问题,但对于内存有限的移动设备来说,这是一个严重的问题)

以下是电影设置代码的剪贴:

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子类将完成此任务(假设它可以访问您使用前面的代码创建的电影)

视图不会在没有帮助的情况下触发自身被重新绘制,盲目地在onDraw末尾调用invalidate()只会浪费能量。在另一个线程(可能是您用来下载图像数据的线程)中,您可以向主线程发布消息,要求以稳定(但不是疯狂)的速度使视图无效


希望它能帮助您理解

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

第一步是构建电影实例。有一个名为decodeStream的工厂,它可以在给定InputStream的情况下制作电影,但仅使用URL连接中的流是不够的。如果您尝试此操作,当电影加载程序尝试调用流上的重置时,您将得到一个IOException。不幸的是,黑客使用了一个单独的BufferedInputStream,并带有一个手动设置的标记,告诉它保存足够的数据,以便重置不会失败。幸运的是,URLConnection可以告诉我们需要多少数据。我说这种黑客行为是不幸的,因为它实际上需要将整个图像缓冲在内存中(这对于桌面应用程序来说没有问题,但对于内存有限的移动设备来说,这是一个严重的问题)

以下是电影设置代码的剪贴:

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子类将完成此任务(假设它可以访问您使用前面的代码创建的电影)

视图不会在没有帮助的情况下触发自身被重新绘制,盲目地在onDraw末尾调用invalidate()只会浪费能量。在另一个线程(可能是您用来下载图像数据的线程)中,您可以向主线程发布消息,要求以稳定(但不是疯狂)的速度使视图无效


希望它能帮助您理解

我建议您使用能够支持GIF的第三方库

我用Giphy的API制作了一个显示GIF的快速示例应用程序


希望这有帮助

我建议使用能够支持GIF的第三方库

我用Giphy的API制作了一个显示GIF的快速示例应用程序


希望这对你有所帮助

如果你进行了研发,那么你就能找到它,最好的选择是在webview中打开该url。@Dev我尝试过,但看起来我打开了网站,因为它显示了所有选项。.我只想让用户看到动画gif。.我尝试了Javanator编写的内容,它对他提供的url非常有效,但对我的url不起作用。.如果你进行了研发,那么你就可以找到它,最好的选择是在webview中打开该url。@Dev我尝试过,但看起来像是打开了网站,因为它显示了所有选项。.我只想让用户看到动画gif。.我尝试了Javanator编写的内容,它对他提供的url非常有效,但对我的url不起作用。.我想从url播放。.我应该将R.dravable.some_gif替换为url?我想从url播放..我应该用url替换R.drawable.some_gif吗?这样我应该把url放在字符串x=“giphy.com/gifs/fully-cat-DFiwMapItOTh6”中吗你能写下我应该在字符串x中放什么吗?你上面给出的代码没有起始体标记,但有结束体标记?img是标记吗?谢谢你的时间…@user3753273立即检查字符串x=“”;我试过了,但代码“insert”中出现了错误;“要完成LocalVariableDeclarationStatement”“。可能是因为引号。如果我删除了所有引号,但应用程序运行时显示的是空白的webview…我是否应该使用引号…我更新鲜…感谢您的时间…如果我复制粘贴了也显示语法错误的代码,请插入”;”要完成LocalVariableDeclarationStatement,就是这样,我应该把url放在字符串x=“giphy.com/gifs/funcy-cat-DFiwMapItOTh6”你能不能把我应该放在字符串x中的内容写下来?你上面给出的代码没有起始体标记,但有结束体标记?img是一个标记吗?谢谢你的时间…@user3753273 check now字符串x=“”;我试过了,但代码“insert”中出现了错误;“要完成LocalVariableDeclarationStatement”。可能是因为引号的缘故。如果我删除所有
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();