2

我希望按钮向下移动 200 像素(从 0,0 到 0, 200),并在 1 秒后再次向上移动到原始位置。

但以下代码的行为就像从 (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>
4

2 回答 2

1

我找到了解决方案。TranslateAnimation() 参数中的坐标不是绝对坐标。因为我调用了 setStartOffset(N),所以 aniMoveBack 动画将从 aniMove 坐标的末尾开始。是相对位置。

所以,代码应该像这样固定..

TranslateAnimation aniMoveBack = new TranslateAnimation(0, 0, 0, -DISTANCE);
于 2013-01-08T04:35:31.833 回答
1

AnimationSet 代表一组应该一起播放的动画。每个单独动画的变换组合在一起成为一个变换。

AnimationSet 不能这样使用,它可以结合多动画的特性。使用 AnimationSet,您可以同时执行 alpha 和旋转动画。

如果要按顺序播放 2 个动画,则应在第一个动画的 onAnimationEnd() 中启动第二个动画。

于 2013-01-07T09:53:19.787 回答