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