代码之家  ›  专栏  ›  技术社区  ›  rndmcnlly

Android:在给定url的情况下,如何显示大型动画gif?

  •  14
  • rndmcnlly  · 技术社区  · 15 年前

    假设我有大型动画gif的URL,我想制作一个类似youtube的活动,以流式方式显示动画。我该怎么办

    1. 让它与实际动画一起显示?

    ImageView 不是答案,因为它只显示第一帧。

    一个额外的好处是可以访问它的缓冲状态,这样我也可以同步流媒体声音——这是 YTMND

    4 回复  |  直到 14 年前
        1
  •  12
  •   rndmcnlly    15 年前

    解决方案的总体方案是使用自定义 View 哪个画要一个 Movie Canvas 定期地

    电影 例子有一家工厂叫 decodeStream InputStream 但是仅仅使用来自一个服务器的流是不够的 UrlConnection . 如果你尝试这个,你会得到一个 IOException reset 在溪流上。不幸的是,黑客使用的是一个单独的 BufferedInputStream 手动设置 mark 告诉它保存足够的数据 重置 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 电影 您是使用前面的代码创建的)。

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

    视图不会在没有帮助和盲目调用的情况下触发自身被重新绘制 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();
    

    一个非常好的解决方案应该有各种各样的进度条和错误检查,但核心在这里。

        2
  •  1
  •   JRL    15 年前

    你试过了吗 BitmapDecode ?

    API演示中有一个示例 here .

        3
  •  1
  •   Hitesh Sahu    9 年前

    Glide

    Glide.with(getApplicationContext())
                .load(Uri.parse("https://media1.giphy.com/media/5ziaphcUWGKPu/200.gif"))
                .asGif().placeholder(R.drawable.ic_launcher).crossFade()
                .into(imageView);
    

    结果如下:-

    enter image description here

    http://giphy.com/search/big-gif/3

    从这里添加jar:- https://github.com/bumptech/glide/releases

        4
  •  0
  •   concept    13 年前

    大概 动画可绘制 能为你工作吗?编辑:如果你想从像这篇文章一样的URL加载,就不需要了。很抱歉

    http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html