Android:动画完成后更新LinearLayout位置

时间:2011-04-28 17:31:23

标签: android animation

对以下问题的任何帮助将不胜感激。我知道我需要做什么,并且我检查了开发人员文档,但我需要使用的确切语法使我(我是菜鸟)。

这就是我正在做的事情。我在res / anim中有一个translate.xml文件可以正常工作。它看起来像这样:

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
   android:fromXDelta="0%" 
   android:toXDelta="0%" 
   android:fromYDelta="0%" 
   android:toYDelta="10%" 
   android:repeatCount="0" 
   android:duration="1000" 
   android:fillEnabled="true" 
   android:fillAfter="true"/>

我正在执行我的代码:

    l = (LinearLayout) findViewById(R.id.linearLayout1);
    a = AnimationUtils.loadAnimation(this, R.anim.translate);
    a.setAnimationListener(new AnimationListener() {
        public void onAnimationStart(Animation anim){};
        public void onAnimationRepeat(Animation anim){};
        public void onAnimationEnd(Animation anim){
            //l.setLayoutParams(params);
        };
    });
l.startAnimation(a);

当动画完成时,我希望动画的LinearLayout移动到它的新位置(动画将其移动到的位置)。原因是LinearLayout包含用户可以与之交互的几个表单元素。

对于一个相当简单的项目,这是一个真正的简单动画。它只是将元素向下移动大约30个像素。我不会寻求帮助,除非我已经在这几个小时内一直在努力。我知道我需要在动画结束时更新LinearLayout的参数,但具体如何呢?我已经阅读了几种不同的方式,它们都有点令人困惑。

提前致谢。

2 个答案:

答案 0 :(得分:0)

尝试实现当前(或新)类的AnimationListener接口,而不是创建新的AnimationListener。然后只需覆盖onAnimationEnd()方法。

示例:

public class ThisClass implements AnimationListener {

      private otherMethod() {
          l.getAnimation().setAnimationListener(this);
      }

      public void onAnimationStart(Animation anim){};
      public void onAnimationRepeat(Animation anim){};
      public void onAnimationEnd(Animation anim){
          l.setLayoutParams(params);
      };

}

答案 1 :(得分:0)

最后有办法解决,正确的方法是 setFillAfter(true)

如果你想用xml定义你的动画那么你应该做这样的事情

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/decelerate_interpolator"
     android:fillAfter="true">

    <translate 
        android:fromXDelta="0%"
        android:toXDelta="-100%"
        android:duration="1000"/>

</set>

您可以看到我在filterAfter="true"标记中定义了 set ,如果您尝试在translate标记中定义它,它将无效,可能是框架中的 bug !!

然后在代码中

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out);
someView.startAnimation(anim);

TranslateAnimation animation = new TranslateAnimation(-90, 150, 0, 0);

            animation.setFillAfter(true);

            animation.setDuration(1800);

            someView.startAnimation(animation);

然后肯定会有效!!

现在这有点棘手似乎视图实际上移动到新位置但实际上视图的像素被移动,即您的视图实际上处于其初始位置但不可见,您可以测试它是否有你在视图中的一些按钮或可点击的视图(在我的布局中),修复你必须手动将视图/布局移动到新位置

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

new TranslateAnimation(-90, 150, 0, 0);

现在我们可以看到我们的动画将从-90 x轴开始到150 x轴

所以我们做的是设置

someView.setAnimationListener(this);

并在

public void onAnimationEnd(Animation animation)
{
   someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight());
}

现在让我解释一下public void layout (int left, int top, int right, int botton)

它将你的布局移动到新位置第一个参数定义左边,我们 150 ,因为翻译动画已将我们的视图设置为 150 x轴 top为0 ,因为我们没有动画y轴,现在我们已经完成了someView.getWidth() + 150我们基本上得到了视图的宽度并添加了 150 ,因为我们是left现在移动到 150 x轴,使视图宽度为原点1,底部等于视图高度。

我希望你们现在能够理解翻译的概念,但是你仍然可以在评论部分立即提出任何问题,我很乐意提供帮助:)

编辑不要使用layout()方法,因为当视图无效并且您的更改不会保留时,框架可以调用它,使用LayoutParams设置您的布局参数根据您的要求