终于找到了解决方法,正确的方法是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"
in the set
标签,如果您尝试在中定义它translate
标记它不起作用,可能是bug在框架内!!
然后在代码中
Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out);
someView.startAnimation(anim);
OR
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);
and in
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 is 0因为我们还没有对 y 轴进行动画处理,现在我们已经完成了someView.getWidth() + 150
基本上我们得到了视图的宽度并添加了150因为我们的左边现在移动到150 x 轴使视图宽度恢复到原来的宽度,底部等于视图的高度。
我希望你们现在了解翻译的概念,并且您仍然有任何问题可以立即在评论部分提出,我很乐意提供帮助:)
EDIT不要使用layout()
方法,因为当视图无效并且您的更改不会保留时,框架可以调用它,请使用LayoutParams
根据您的要求设置布局参数