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