Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓:在九个旧安卓的帮助下,我们如何将EndAction向后移植到旧版本_Android - Fatal编程技术网

Android 安卓:在九个旧安卓的帮助下,我们如何将EndAction向后移植到旧版本

Android 安卓:在九个旧安卓的帮助下,我们如何将EndAction向后移植到旧版本,android,Android,我正在做一件事,需要大约10个动画一个接一个地播放,但在每个动画结束时都有一些条件需要检查,所以我不能使用动画集或设置开始延迟 我发现在果冻豆上使用新方法很容易,其中的新方法是withEndAction,当时我正在做一个实验,但现在我必须用minSdk 10在一个应用程序中实现它 我使用的是九个旧的Android,它工作得很好,但是使用setListner非常困难,并且创建的代码很难维护10个连续的动画 所以我在想,创建一个从九个旧的androids继承的适配器,我可以添加withEndActi

我正在做一件事,需要大约10个动画一个接一个地播放,但在每个动画结束时都有一些条件需要检查,所以我不能使用动画集或设置开始延迟

我发现在果冻豆上使用新方法很容易,其中的新方法是withEndAction,当时我正在做一个实验,但现在我必须用minSdk 10在一个应用程序中实现它

我使用的是九个旧的Android,它工作得很好,但是使用setListner非常困难,并且创建的代码很难维护10个连续的动画

所以我在想,创建一个从九个旧的androids继承的适配器,我可以添加withEndAction函数来执行runnable

有人能指导我怎么做吗?有没有更好的方法


谢谢

我可以想到两种选择:

  • 使用facade模式创建自己的动画池(这可能需要大量工作)
  • 从ADT获取源代码并对其进行修改。如果你找不到,这里有:。将其复制到您自己的包中(类似于
    ViewPropertyAnimatorCompat
    )。该类似乎与其他Android类没有太多的耦合,因此应该按原样工作:)
  • 更新:这里是另一个选项,动画队列。与第一个想法类似,但更直截了当一点:
  • 代码:


    干杯

    我的解决方案也使用了神奇的九面阵

    反而 的

    是的

    animate(starsBig[4])。rotationBy(3600)。setDuration(2010);
    this.runOnUiThread(新的Runnable(){
    公开募捐{
    对于(int i=0;i<5;i++){
    starReset(stars[i]);
    starReset(starsBig[i]);
    }
    }
    });
    

    对于一个动画来说效果很好

    我想我有更好的解决方案:

                view.animate().setDuration(2000).alpha(0);
                //timAnimDelay.purge();
                timAnimDelay.schedule(new TimerTask() {
                    @Override
                    public void run() {
    
                        // on UI thread
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                // here animation
                            }
                        });
                    }
                // delay start
                } , 2000);
                timAnimDelay.purge();
    
    我曾经

    if(Build.VERSION.SDK\u INT
    基本上,为了使代码更具可读性,您可以使用内置命令将您从匿名内部类混乱中解救出来。您甚至可以将其进一步抽象,使其看起来像
    withEndAction
    ,如下所示:

    import android.animation.Animator;
    import android.animation.AnimatorListenerAdapter;
    import android.app.Application;
    import android.support.v4.view.ViewPropertyAnimatorListener;
    import android.view.View;
    
    
    public class AnimatorActionListener extends AnimatorListenerAdapter {
    
    public enum ActionType {
        START, END;
    }
    
    final private ActionType type;
    final private Runnable action;
    
    public AnimatorActionListener(Runnable action, ActionType type) {
        this.action = action;
        this.type = type;
    }
    
    @Override
    public void onAnimationEnd(Animator animation) {
        if (type == ActionType.END) {
            action.run();
        }
    }
    
    @Override
    public void onAnimationStart(Animator animation) {
        if (type == ActionType.START) {
            action.run();
        }
    }
    }
    
    然后用法变成:

     view.animate()./*...some parameters...*/.setListener(new AnimatorActionListener(new Runnable() {
            @Override
            public void run() {
                // do stuff
            }
        }, ActionType.END)); // or ActionType.START
    

    对于那些必须使用平台内置函数(带有StartAction的
    和带有EndAction的
    )的用户,只需将SDK检查代码也放在
    AnimatorActionListener
    中,就可以从混乱中保存客户端类。

    您现在可以使用
    ViewCompat
    并附加任何需要的动画

    ViewCompat.animate(yourView).scaleY(3).withEndAction(yourRunnable).start();
    

    感谢您的帮助,第一个选项似乎很难实现,我尝试了第二个选项,但它似乎依赖于api级别16的视图类中的某个函数,您是否建议也复制视图,或者是否有其他解决方案?然后,将其放入项目的包
    android.View
    。(有点小技巧,但应该可以)修改名称以避免冲突:)此外,将构造函数公开或创建静态访问器方法。此处无需使用计时器任务。。。只需使用
    newhandler().postDelayed()
    。无论哪种方式,此方法都可能不如上面Blundell的答案好(可能动画运行时间比预期的稍长,例如,如果同时发生多个动画…如果是这种情况,则可能在动画完成之前执行runnable)。删除onAnimationEnd()中的侦听器,以防止以后在同一对象上执行动画时再次调用它。最好去掉if语句,只使用:
    viewPropertyAnimator.setListener(新的AnimatorListenerAdapter(){@Override public void onAnimationEnd(Animator动画){doSomething();}});
                view.animate().setDuration(2000).alpha(0);
                //timAnimDelay.purge();
                timAnimDelay.schedule(new TimerTask() {
                    @Override
                    public void run() {
    
                        // on UI thread
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                // here animation
                            }
                        });
                    }
                // delay start
                } , 2000);
                timAnimDelay.purge();
    
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
            viewPropertyAnimator.setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    doSomething();
                }
            });
        } else {
            viewPropertyAnimator.withEndAction(new Runnable() {
                @Override
                public void run() {
                    doSomething();
                }
            });
        }
    
    import android.animation.Animator;
    import android.animation.AnimatorListenerAdapter;
    import android.app.Application;
    import android.support.v4.view.ViewPropertyAnimatorListener;
    import android.view.View;
    
    
    public class AnimatorActionListener extends AnimatorListenerAdapter {
    
    public enum ActionType {
        START, END;
    }
    
    final private ActionType type;
    final private Runnable action;
    
    public AnimatorActionListener(Runnable action, ActionType type) {
        this.action = action;
        this.type = type;
    }
    
    @Override
    public void onAnimationEnd(Animator animation) {
        if (type == ActionType.END) {
            action.run();
        }
    }
    
    @Override
    public void onAnimationStart(Animator animation) {
        if (type == ActionType.START) {
            action.run();
        }
    }
    }
    
     view.animate()./*...some parameters...*/.setListener(new AnimatorActionListener(new Runnable() {
            @Override
            public void run() {
                // do stuff
            }
        }, ActionType.END)); // or ActionType.START
    
    ViewCompat.animate(yourView).scaleY(3).withEndAction(yourRunnable).start();