美文网首页移动互联网@IT·互联网Android知识
Android 中 GIF 动图的播放控制与监听

Android 中 GIF 动图的播放控制与监听

作者: smartbeng | 来源:发表于2017-05-20 23:43 被阅读1049次

    保证你会用得到,有用就关注作者并点个赞支持一下,后续会继续分享干货,不容错过,最近接手的项目里涉及到了 GIF 动图的播放与监听,在上一版本中对于 GIF 的处理是由 H5 来实现的,因为考虑到用户体验,因此现在的需求是将这块儿原生化,途中差点误入歧途!

    最终实现效果,如下是一个 GIF 图片,下方是 Button 按钮:

    效果图

    Android 中 GIF 动图处理与监听

    刚开始第一个想到的便是 glide , 但是自认为 glide 不能够控制 GIF 以及去监听它,所以网上去搜寻别的方法。看到有一个方案是将图片分帧,一张张的去用逐帧动画来实现。

    我开始怀疑给这个解决方案的人了,都什么时代了还做这种费力不讨好,大量占用用户内存的东西!于是乎动手前又仔细 Google 了一番,答案着实令我尴尬,glide 是可以控制 GIF 动画的!!!

    怒上代码 :使用glide 加载 GIF 动图

    Glide.with(DoorActivity.this).load(R.drawable.opendoor).into(openDoorGif);
    

    很简单的一行代码就可以搞定,以上方式图片和动图都可以加载(网络链接亦可)

    下面是只可以加载 GIF 动图的写法:

    Glide.with(DoorActivity.this).load(R.drawable.opendoor).asGif().into(openDoorGif);
    

    其实就多了个 asGIF

    但是这种方式下的动图播放一直是循环的,有什么方式可以停下来呢!没遇到过千万别说没必要,假如现在有一个需求,需要点击一下按钮来播放一次 GIF 实现与用户的交互呢?这个技能我想你肯定是要 get 的,因为类似需求你迟早会碰到!

    下面写法实现了对 GIF 动图的控制

    //handler发送消息成功的状态码
    private static final int MESSAGE_SUCCESS = 4424;
    //handler发送消息所携带的参数(持续时间)
    private int duration;
    
    /**
     * 加载开门Gif动图(只播放一次)
     * @param view
     */
    public void loadGif(View view){        
        Glide.with(this)
             .load(R.drawable.opendoor)
             .diskCacheStrategy(DiskCacheStrategy.SOURCE)
             .listener(new RequestListener<Integer, GlideDrawable>() {
    
                  @Override
                   public boolean onException(Exception arg0, Integer arg1,
                      Target<GlideDrawable> arg2, boolean arg3) {
                          return false;
                      }
    
                   @Override
                   public boolean onResourceReady(GlideDrawable resource,
                       Integer model, Target<GlideDrawable> target,
                       boolean isFromMemoryCache, boolean isFirstResource) {
                       // 计算动画时长
                       GifDrawable drawable = (GifDrawable) resource;
                       GifDecoder decoder = drawable.getDecoder();
                       for (int i = 0; i < drawable.getFrameCount(); i++) {
                           duration += decoder.getDelay(i);
                       }
                       //发送延时消息,通知动画结束
                       //以下两个参数都是 int 型,记得如上的声明
                       handler.sendEmptyMessageDelayed(MESSAGE_SUCCESS,
                             duration);
                            return false;
                        }
                    }) 
                       //仅仅加载一次gif动画
                       //此处的参数 1 及时指明播放次数
                    .into(new GlideDrawableImageViewTarget(openDoorGif, 1)); 
    }
    

    使用这种方式就可以完美的实现对 GIF 的控制,对我遇到的需求提供了良性支持!

    相关文章

      网友评论

        本文标题:Android 中 GIF 动图的播放控制与监听

        本文链接:https://www.haomeiwen.com/subject/ehcmxxtx.html