如何在Android中按顺序为TextViews设置动画?

时间:2013-09-16 20:08:25

标签: android animation textview handler

我正在开发一个有四个可能答案的问题游戏。每个答案都是TextView。我想要的是,在用户选择答案之后,在显示下一个问题之前,与答案相关联的文本框在屏幕上留下右边的动画,但是以顺序的方式延迟很小。下面是一个如何的例子:

                            ---------
                          | Answer 1 |
                           ----------
                  ---------
                | Answer 2 |
                 ----------
         ----------
        | Answer 3 |
         ----------

为了安排每个答案视图的动画的开始,在一定的延迟之后,我使用Handler类。问题是,当运行代码时,屏幕的视图不是顺序延迟,它们同时离开屏幕而我没有达到预期的效果。显然我已经尝试增加延迟但是它没有解决问题。这是我使用的代码片段:

        TextView answerViewA = (TextView) findViewById(R.id.textViewAnswerA);
        TextView answerViewB = (TextView) findViewById(R.id.textViewAnswerB);
        TextView answerViewC = (TextView) findViewById(R.id.textViewAnswerC);
        TextView answerViewD = (TextView) findViewById(R.id.textViewAnswerD);

        ArrayList<TextView> answerViewCollection = new ArrayList<TextView>(
                4);
        answerViewCollection.add(answerViewA);
        answerViewCollection.add(answerViewB);
        answerViewCollection.add(answerViewC);
        answerViewCollection.add(answerViewD);

        final Animation exitAnim = AnimationUtils.makeOutAnimation(
                mContext, true);
        final int delay = 200;

        for (int i = 0; i < answerViewCollection.size(); i++) {

            final View auxView = answerViewCollection.get(i);

            mHandler.postDelayed(new Runnable() {

                @Override
                public void run() {
                    auxView.startAnimation(exitAnim);
                }

            }, delay * i);
        }

我的限制是:android:minSdkVersion="10"。我感谢任何建议:)

2 个答案:

答案 0 :(得分:2)

问题似乎是您正在重复使用相同的Animation实例为不同的视图设置动画。

Animation对象不仅仅是一个动画描述,它是一个实时动画,拥有自己的动画状态。因此,如果您共享相同的Animation实例,则共享相同的动画状态,因此在给定时间内进行相同的转换。

如果您的minSdkVersion10,我认为正确的方法是使用专为

设计的AnimationLayoutController
  

(...)为布局或视图组的子项设置动画。每个孩子使用相同的动画,但对于每一个孩子,动画都会在不同的时间开始。

您还可以创建许多具有不同延迟的Animation个实例,但我不确定它是否是最佳的。

答案 1 :(得分:0)

你走了:

for (int i = 0; i < answerViewCollection.size(); i++) {
    final View auxView = answerViewCollection.get(i);

    final Animation exitAnim = AnimationUtils.makeOutAnimation(this,
            true);
    exitAnim.setDuration(1000);
    exitAnim.setStartOffset(delay * i);
    auxView.startAnimation(exitAnim);
    auxView.setVisibility(View.INVISIBLE);
}