Android:animation位置完成后重置

我正在使用xml定义的animation从屏幕上滑动视图。 问题是,一旦animation完成,重置到原来的位置。 我需要知道如何解决这个问题。 这里是xml:

<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator"> <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500"/></set> 

下面是我用来调用它的Java:

  homeScrn = (View)findViewById(R.id.homescreen); slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); //Set Click Listeners For Menu btnHelp.setOnClickListener(new OnClickListener() { public void onClick(View v) { LayoutInflater.from(getApplicationContext()).inflate(R.layout.help, (ViewGroup)findViewById(R.id.subpage), true); homeScrn.startAnimation(slideLeftOut); } }); 

所以基本上发生了什么是我膨胀一个下面的观点。 然后,我将视图放在左边。 一旦它离开屏幕并且animation结束,它就重置它的位置。

animation按预期工作。 只是因为你animation的东西并不意味着你实际上移动了它。 animation只影响animation本身的绘制像素,而不影响小部件的configuration。

你需要添加一个AnimationListener ,并且在onAnimationEnd()方法中,做一些让你的移动永久的东西(例如,从父视图中删除顶部的视图,将视图标记为具有可见性GONE )。

终于有办法解决了,正确的做法是setFillAfter(true)

如果你想在xml中定义你的animation,那么你应该做一些这样的事情

 <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> 

你可以看到我已经在set标签中定义了filterAfter="true" ,如果你试图在translate标签中定义它,它将不起作用,可能是框架中的错误

然后在“守则”中

 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); 

那么它一定会工作!

现在这有点棘手,它看起来像是实际上移动到新的位置,但实际上视图的像素被移动,即您的视图实际上是在其初始位置,但不可见,你可以testing它,如果你有一些button或在您的视图中的可点击查看(在我的情况下在布局),以解决您必须手动将您的视图/布局移动到新位置

 public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) new TranslateAnimation(-90, 150, 0, 0); 

现在我们可以看到我们的animation将从-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 ,因为翻译animation已经animation我们的视图为150 x轴顶部为0,因为我们没有animationY轴,现在在右边,我们已经完成someView.getWidth() + 150基本上我们得到了我们视图的宽度,并增加了150,因为我们的左边现在移动到150 x轴 ,使视图宽度为原始视图宽度,底部等于我们视图的高度。

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

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

我可能会有点晚回复,但我有这个解决scheme:

只需在你的xml中添加android:fillAfter=true

您可以使用

 fillAfter=true fillEnabled=true 

您的视图将不会重置为原始位置,但是如果您在视图中有一些button或其他东西,则它们的位置不会改变。

您必须使用ObjectAnimator ,它从API 11级别起作用。 它自动改变查看位置,

这里是例子

 ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX); objectAnimator.setDuration(1000); objectAnimator.start(); 

感谢JUL的回答

如果您的应用程序未findobject animator ,请从Project -> properties -> Android更改API级别,而不是import android.animation.ObjectAnimator;

问候海克

你需要添加这个命令:

 final Animation animSlideLeft = new TranslateAnimation(0, -80, 0,-350, 0, 0, 0, 0); animSlideLeft.setFillAfter(true); 

我去了相同的问题,并通过在OnAnimationEnd()设置marginLeft解决它。

MarginLayoutParams params = (MarginLayoutParams) this.getLayoutParams(); params.setMargins(this.getWidth()*position, 0,0,0); this.setLayoutParams(params);

这个问题困扰了一个多星期。 穆罕默德的回答指出了我解决这个问题的一个非常直接的方法。

我用sever布局来实现animation的侧面菜单。 “view.layout不会持久化,你应该使用LayoutParams,这将是持久的。”

这里是我的解决scheme:(使用什么样的LayoutParameter取决于你自己的父母的布局):

 @Override public void onAnimationEnd(Animation animation) { FrameLayout.LayoutParams layoutParams=new FrameLayout.LayoutParams(screenWidth, screenHeight); layoutParams.setMargins((int) -(screenWidth * RATE), 0, (int) (screenWidth - screenWidth * RATE), screenHeight); for(View v:views) { v.setLayoutParams(layoutParams); //v.layout((int) -(screenWidth * RATE), 0, (int) (screenWidth - screenWidth * RATE), screenHeight); v.clearAnimation(); } }