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

Android:动画完成后更新LinearLayout位置,android,animation,Android,Animation,如果您对以下问题有任何帮助,我们将不胜感激。我知道我需要做什么,并且我已经检查了开发人员文档,但是我不知道我需要使用的确切语法(我是一个noob) 这是我正在做的。我在res/anim中有一个translate.xml文件,可以正常工作。看起来是这样的: <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0%" android:toXDelta=

如果您对以下问题有任何帮助,我们将不胜感激。我知道我需要做什么,并且我已经检查了开发人员文档,但是我不知道我需要使用的确切语法(我是一个noob)

这是我正在做的。我在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包含多个用户可以交互的表单元素

这是一个非常简单的项目的真正简单的动画。它只是将元素沿屏幕向下移动约30像素。我不会寻求帮助,除非我已经为此挣扎了好几个小时了。我知道我需要在动画结束时更新LinearLayout的参数,但具体如何更新?我读过几种不同的方法,它们都有点让人困惑


提前感谢。

不要创建新的
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);
      };

}终于找到了解决问题的方法,正确的方法是
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>

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());
}
现在让我解释一下
公共void布局(int left,int top,int right,int botton)

它将布局移动到新位置第一个参数定义左边,我们是150,因为平移动画将我们的视图设置为150 x轴顶部为0,因为我们没有设置y轴的动画,现在在右边我们完成了
someView.getWidth()+150
基本上,我们得到了视图的宽度,并添加了150,因为我们的左侧现在移动到150 x轴,以使视图宽度为其原始宽度,底部等于视图的高度

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


EDIT不要使用
layout()
方法,因为当任何视图无效且您的更改不会预先列出时,框架都可以调用该方法。请使用
LayoutParams
根据您的要求设置布局参数,这似乎是有意义的。我按照您的指示使用AnimationListener扩展了Cals,并添加了必要的listener方法。除了“params”无法解析为onAnimationEnd方法中的变量之外。你这是什么意思?参数将引用什么?和l.getAnimation().setAnimationListener(此);使我的应用程序崩溃:-(您需要创建一个新的LayoutParams变量,或者为类创建一个public。为什么它会崩溃(logcat怎么说)?a.setAnimationListener(此);设置LayoutParams并传入值是我感到困惑的地方。我不知道如何将LinearLayout设置为新的位置,或者这是否是我应该做的。
public void onAnimationEnd(Animation animation)
{
   someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight());
}