【问题标题】:AnimationListener inside of a loop? (Wait for animation to complete each time)循环内的AnimationListener? (每次等待动画完成)
【发布时间】:2014-03-18 05:08:25
【问题描述】:

更新:为了让我的问题更清楚:我应该如何构建循环,以确保在上一次迭代的动画结束之前不会发生下一次迭代?

所以我对在 android 中使用动画还是很陌生。我有一个简单的动画,每次使用 placeTile 方法放置瓷砖时都会运行。

代码如下:

public void setUpPlayers(){

    //Toast for setting turn order
    smallToast(getResources().getString(R.string.deciding_turn_order));

    for (int i = 0; i < players.length; i++) {
        if(i == 0){
            players[i] = new Player("HUMAN", 6000);
            players[i].setType(Player.Type.HUMAN);
        } else {
            players[i] = new Player(playerNames[i], 6000);
            players[i].setType(Player.Type.COMPUTER);
        }           
        players[i].drawTile(1);

        TextView nameText = (TextView) findViewById(R.id.current_player_text);
        nameText.setText(players[i].getName());

        //find the ID for the tile just placed
        String tileID = players[i].findTileIdByIndex(0);

        placeTile(tileID, i); //Tile ID being placed, and the index of the player placing it
    }
}

我遇到的问题是,我希望循环在之前放置的图块的动画完成之前不执行下一次迭代。我怎样才能做到这一点?我知道通常您必须设置一个 AnimationLister 并等待动画完成,但我不确定如何去做,因为 A)动画是放置的 Tile 的一部分并且具有私有范围,并且 B)循环想要立即执行。如何使用监听器“保持”循环?

我想到的一个想法是将setUpPlayers()方法重新构造为递归算法,并且每次迭代都会调用动画,但是方法的迭代是在AnimationListener内部调用的。不过,递归算法似乎有点矫枉过正。有什么想法吗?实现这一目标的最佳、最简单的方法是什么?

提前致谢,

JRad 坏人

【问题讨论】:

  • 您的最小 sdk 要求是多少?

标签: android animation


【解决方案1】:

在我的项目中,我也有类似的情况,我也将我的 min sdk 设置为 8,所以我使用这个库来拥有与最新更新(Animator 类)相同的功能

库 - http://nineoldandroids.com/

我的代码:

    private class MyAnimationListener implements Animator.AnimatorListener{

                ObjectAnimator spinningAnimation;

                @Override
                public void onAnimationStart(Animator animation) {
                    spinningAnimation = ObjectAnimator.ofFloat(playerSpinner, "rotationY", degrees); //In my case I just flip a coin
                    spinningAnimation.setDuration(25);
                    spinningAnimation.addListener(new MyAnimationListener());
                }

               @Override    
               public void onAnimationEnd(Animator animation) {
                   if(repeatCount>0){
                        spinningAnimation.setTarget(playerSpinner);
                        spinningAnimation.start();
                   }
               }

               @Override
               public void onAnimationCancel(Animator animation) {}

               @Override
               public void onAnimationRepeat(Animator animation) {}

}

如果您需要一些帮助以更好地理解,请在 cmets 上提问 :)

【讨论】:

  • 我对 NineOldAndroids 很熟悉,但这不是我的问题。如有必要,我可以设置自定义事件处理。我的问题是,由于动画在循环内,我无法设置动画事件处理程序并让循环暂停。无论在其中设置什么事件处理,循环都会继续重复。我的问题是:我应该如何构建循环,以确保在上一次迭代的动画结束之前不会发生下一次迭代。
  • @JRadtheBad 只是在结束动画上调用开始不这样做吗?如果您将动画侦听器设置为在动画结束时开始您的序列,您可以只使用一个布尔值或一些逻辑来不调用开始...对不起,如果我不理解您的问题
  • 问题是在这个循环中发生了很多其他的事情。我实例化玩家,设置初始资金,并决定名称。我不能/不应该将所有这些都放在事件侦听器中。我必须进行的最终和静态调整的数量似乎很荒谬。这不仅仅是让动画背靠背发生,而是在前一个动画完成之前不开始下一个动画或设置下一个播放器。 for 循环想要执行到最后并且不会通过设置侦听器来停止。它将不断重申。
  • 也许您已经解决了这个问题,而我只是不明白答案? ://
猜你喜欢
  • 1970-01-01
  • 2020-01-04
  • 2015-06-24
  • 2018-02-08
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多