android:GIF动画循环完成听众

Chi*_*oni 6 animation android gif android-glide

我有一个GIF图像,想加载启动画面.我遇到了一些像android-gif-drawable Glide这样的库

有什么方法可以听一个动画周期完成吗?我的意思是一旦动画循环完成(整个动画完成,不重复)我想要一个监听器,动画完成,并为我们提供一些回调.有点像:

SomeLibrary.load("GIF")
.into(imageview)
.repeat(false)
.setOnAnimationCompleteListener(new OnAnimationCompleteListener(){
    public void onAnimationComplete(){
        // Animation is completed. Do whatever you want to do..
    }
});
Run Code Online (Sandbox Code Playgroud)

我曾与两个库合作但是正在寻找我上面提到的功能.

lan*_*loc 16

对于 Glide V4,我发现这是最好的答案。https://github.com/bumptech/glide/pull/3438

Glide.with(this).asGif().load(/*your gif url*/).listener(new RequestListener<GifDrawable>() {
    @Override
    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
        return false;
    }

    @Override
    public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
        resource.setLoopCount(1);
        resource.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
            @Override
            public void onAnimationEnd(Drawable drawable) {
                //do whatever after specified number of loops complete
            }
        });
        return false;
    }
}).into(imageView);
Run Code Online (Sandbox Code Playgroud)


Cod*_*dus 12

更新2018/9/25 在此代码中使用了很长时间

我发现有些手机并没有真正开始运行onResourceReady.意味着我得到isRunning() == false一次onResourceReady.

解决方案:一开始就睡觉.

@Override
    public boolean onResourceReady(final GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
        resource.setLoopCount(1);
        new Thread(new Runnable() {
            @Override
            public void run() {
                Thread.sleep(200);
                while(true) {
                    if(!resource.isRunning()) {
                        onGifFinished();//do your stuff
                        break;
                    }
                }
            }
        }).start();
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

起源

由于GIF在播放时有延迟,我使用线程来监控播放的结束.不是一个非常好但有效的方法.

Glide.with(this).asGif().load(R.raw.gif)
        .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE)).listener(new RequestListener<GifDrawable>() {
    @Override
    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
        onGifFinished();//do your stuff
        return false;
    }

    @Override
    public boolean onResourceReady(final GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
        resource.setLoopCount(1);
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(true) {
                    if(!resource.isRunning()) {
                        onGifFinished();//do your stuff
                        break;
                    }
                }
            }
        }).start();
        return false;
    }
}).into(iv);
Run Code Online (Sandbox Code Playgroud)


Ank*_*ngh 1

你可以使用这个gif库LINK,它有onAnimationCompleted,当一个循环完成时被调用,它还有geturation方法,它给出一个循环的持续时间,你可以使用任何你想要的


 File gifFile = new File(getFilesDir(),"anim.gif");
    GifDrawable gifFromFile = new GifDrawable(gifFile);
    gifFromFile.addAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationCompleted(int loopNumber) {

        }
    });
Run Code Online (Sandbox Code Playgroud)