当前位置:  开发笔记 > 编程语言 > 正文

如何重启android AnimatedVectorDrawables动画?

如何解决《如何重启androidAnimatedVectorDrawables动画?》经验,为你挑选了1个好方法。

我有一个复杂的矢量drawable,我想动画.我使用@ RomanNurik的网络工具从svg创建动画

根据文件说明,这给了我一个有效的.它是一个"一体化"的XML文件.

xml的drawable分为2组,每组包含2个路径,并且还添加了4个动画,如下所示:


    
        
            
                
                
            
            
                
                
            
        
    
    
        
            
                
                
            
        
    
    
        
            
                
                
                
                
            
        
    
    
        
            
                
                
                
                
            
        
    
    
        
            
                
                
            
        
    

问题1:

我不能使用,android:repeatCount="infinite"因为ObjectAnimators有不同的android:durationandroid:startOffset值,这将在一些运行后搞乱动画.所以要走的路是以编程方式重复它.很公平.

问题2:

AnimatedVectorDrawableCompat或AnimatedVectorDrawable都没有一个说动画应该循环的方法.

问题3:

AnimatedVectorDrawableCompat没有,registerAnimationCallback()所以我可以onAnimationEnd自己收听并重新启动动画.此时,我放弃了逆向兼容性.

问题4:

当前实现我有一个使用registerAnimationCallback()AnimatedVectorDrawable只适用于Android的API 25,即使在API 23中添加的方法

AnimatedVectorDrawable drawable = (AnimatedVectorDrawable) context().getDrawable(R.drawable.long_press_anim);
imageView.setImageDrawable(drawable);
drawable.registerAnimationCallback(new Animatable2.AnimationCallback() {
    @Override
    public void onAnimationEnd(Drawable drawable) {
        super.onAnimationEnd(drawable);
        ((AnimatedVectorDrawable) drawable).start();
    }
});
drawable.start();

在API 23和24中,动画作为一次性运行,不重复.

任何想法如何解决这个问题?我即将放弃并使用一个狗屎png序列.



1> Carson Holzh..:

官方和工作答案如下:https://issuetracker.google.com/issues/64591234

此代码适用于> = API 16(可能还有14-15).我正在使用支持库26.1.0和vectorDrawables.useSupportLibrary = true(所以我可以引用xml中的vector drawable而不会崩溃)

animatedVector = AnimatedVectorDrawableCompat.create(getContext(), R.drawable.animated_clock);
ringingAlarmImage.setImageDrawable(animatedVector);
final Handler mainHandler = new Handler(Looper.getMainLooper());
animatedVector.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
    @Override
    public void onAnimationEnd(final Drawable drawable) {
        mainHandler.post(new Runnable() {
            @Override
            public void run() {
                animatedVector.start();
            }
        });
    }
});
animatedVector.start();

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有