【问题标题】:How to start a function when animation has ended?动画结束时如何启动功能?
【发布时间】:2015-12-01 15:35:59
【问题描述】:

我有两个函数可以为两个不同的 TextView 设置动画,但它们似乎同时开始,但我试图让第一个函数的动画先完成,然后再启动第二个函数。

public Boolean functionFinished = false;


public void runFunction(){
    firstFunction();
    if(functionFinished = true){
       secondFunction();
    }

}


public void firstFunction(){

        initialCount = (TextView) findViewById(R.id.textView_Fade);

        initialCount.setText("3");
        final Animation out = new AlphaAnimation(1.0f, 0.0f);
        out.setDuration(1000);
        initialCount.startAnimation(out);

        out.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if(initialCount.getText().equals("3")){
                    initialCount.setText("2");
                    initialCount.startAnimation(out);
                } else if(initialCount.getText().equals("2")){
                    initialCount.setText("1");
                    initialCount.startAnimation(out);
                } else if (initialCount.getText().equals("1")){
                    initialCount.setText("START!");

                }

            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
   functionFinished = true;
}

第二个函数只是从 0 开始每秒更改自己的 textView。

我做错了什么/如何纠正这个问题,以便第二个函数在第一个函数完成后运行? (即,仅当 firstFunction 中的 TextView 为“START!”时才将 functionFinished 设置为 true)

【问题讨论】:

    标签: android android-animation


    【解决方案1】:
    public void runFunction() {
        firstFunction();
    }
    
    public void firstFunction() {
        initialCount = (TextView) findViewById(R.id.textView_Fade);
    
        initialCount.setText("3");
        final Animation out = new AlphaAnimation(1.0f, 0.0f);
        out.setDuration(1000);
    
        out.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }
    
            @Override
            public void onAnimationEnd(Animation animation) {
                ...
                secondFunction();
            }
    
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
    
        initialCount.startAnimation(out);
    }
    

    只需从onAnimationEnd 调用第二个函数。另外请记住,您应该在开始动画之前附加监听器。

    【讨论】:

    • @Divers!我有一个类似的问题,你能帮帮我吗?因为我已经尝试过 AnimationListener 并且它不起作用!我的问题是stackoverflow.com/questions/33987892/…
    • 非常感谢分享。你帮了我很多@Divers :)
    【解决方案2】:

    如果您的最低 sdk 版本是 14:-

    textView1.animate()
             .alpha(0f)
             .setDuration(400)
             .setAnimationListener(new AnimationListener() { 
              @Override 
              public void onAnimationEnd(Animation arg0) {
                   // animate second textview here....
              } 
    }); 
    

    【讨论】:

      【解决方案3】:

      因为您在 firstFunction() 的末尾分配了 functionFinished = true。

      而且你一定误会initialCount.startAnimation(out)会阻塞代码而firstFunction()只有在动画结束后才完成。

      initialCount.startAnimation(out) 不会阻塞任何代码,functionFinished = true 会立即运行。所以secondFunction() 将在firstFunction() 完成后立即运行,而不是动画完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-20
        相关资源
        最近更新 更多