2013-01-07 1 views
2

Я ожидаю, что кнопка сдвинется на 200px (от 0,0 до 0, 200) и через 1 секунду снова переместится в исходное положение.TranslateAnimation в AnimationSet не начинается с 0 позиции, почему?

Но следующий код действует как вылете из (0,200) до (0,400), а не начинать с (0,0)

Если я ставлю одну анимацию в AnimationSet, он отлично работает. Но это работает странно, если я помещаю более двух анимаций в AnimationSet.

В чем проблема?

public class MainActivity extends Activity { 
    private static final int DISTANCE = 200; 
    private static final long DURATION = 1000; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button btn = (Button) findViewById(R.id.button1); 

     TranslateAnimation aniMove = new TranslateAnimation(0, 0, 0, DISTANCE); 
     aniMove.setDuration(DURATION); 

     TranslateAnimation aniMoveBack = new TranslateAnimation(0, 0, DISTANCE, 0); 
     aniMoveBack.setDuration(DURATION); 
     aniMoveBack.setStartOffset(DURATION + 1000); 

     AnimationSet aniSet = new AnimationSet(true); 
     aniSet.addAnimation(aniMove); 
     aniSet.addAnimation(aniMoveBack); 
     btn.startAnimation(aniSet); 
    } 
} 

Вот XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="0dp" > 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 
</LinearLayout> 

ответ

1

AnimationSet представляет собой группу анимаций, которые должны быть воспроизведены вместе. Преобразование каждой отдельной анимации составлено в виде одного преобразования в .

AnimationSet не может использоваться таким образом, он может сочетать в себе функцию мульти анимации. Используя AnimationSet, вы можете одновременно выполнять альфу и поворачивать анимацию.

Если вы хотите сыграть 2 анимации в порядке, вы должны запустить вторую анимацию в onAnimationEnd() первой анимации.

1

Я нашел решение. Координаты в параметре TranslateAnimation() не являются абсолютными. Поскольку я назвал setStartOffset (N), анимация aniMoveBack начнется с конца координаты aniMove. Это относительное положение.

Таким образом, код должен быть установлен, как это ..

TranslateAnimation aniMoveBack = new TranslateAnimation(0, 0, 0, -DISTANCE); 
Смежные вопросы