3

我正在开发一个有四个可能答案的问题游戏。每个答案都是一个 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". 我很感激任何建议:)

4

2 回答 2

2

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

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

如果你minSdkVersion10,我认为正确的方法是使用AnimationLayoutController专门设计的

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

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

于 2013-09-16T20:50:46.063 回答
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);
}
于 2013-09-16T20:27:27.640 回答