Android:完成后动画位置重置

Lon*_*fPR 64 android

我正在使用xml定义的动画来滑动屏幕上的视图.问题是,一旦动画完成,它就会重置到原始位置.我需要知道如何解决这个问题.这是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>
Run Code Online (Sandbox Code Playgroud)

这是我用来调用它的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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

所以基本上发生的事情是我在一个下面膨胀一个视图.然后我在顶部向左侧显示视图的动画.一旦它离开屏幕并且动画结束,它就会重置其位置.

Muh*_*bar 108

最后有办法解决,正确的做法是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>
Run Code Online (Sandbox Code Playgroud)

你可以看到我已filterAfter="true"set标签中定义,如果你试图在translate标签中定义它将无法正常工作,可能是框架中的错误 !!

然后在守则中

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide_out);
someView.startAnimation(anim);
Run Code Online (Sandbox Code Playgroud)

要么

TranslateAnimation animation = new TranslateAnimation(-90, 150, 0, 0);

animation.setFillAfter(true);

animation.setDuration(1800);

someView.startAnimation(animation);
Run Code Online (Sandbox Code Playgroud)

那肯定会有用!!

现在这有点棘手似乎视图实际上移动到新位置但实际上视图的像素被移动,即您的视图实际上处于其初始位置但不可见,如果有一些按钮,您可以测试它或视图中的可点击视图(在我的布局中),修复您必须手动将视图/布局移动到新位置

public TranslateAnimation (float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)

new TranslateAnimation(-90, 150, 0, 0);
Run Code Online (Sandbox Code Playgroud)

现在我们可以看到我们的动画将从-90 x轴到150 x轴开始

所以我们所做的就是设定

someView.setAnimationListener(this);
Run Code Online (Sandbox Code Playgroud)

并在

public void onAnimationEnd(Animation animation)
{
   someView.layout(150, 0, someView.getWidth() + 150, someView.getHeight());
}
Run Code Online (Sandbox Code Playgroud)

现在让我解释一下 public void layout (int left, int top, int right, int botton)

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

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

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

  • 我正在做相同的@CommonsWare告诉,但**正在闪烁**.设置setFillAfter(true)做的伎俩,谢谢你! (2认同)

Com*_*are 83

动画按预期工作.仅仅因为你动画的东西并不意味着你真的移动了它.动画仅影响动画本身的绘制像素,而不影响小部件的配置.

您需要添加一个AnimationListener,并在该onAnimationEnd()方法中执行一些使您的移动永久化的内容(例如,从其父级移除顶部的视图,将顶部的视图标记为具有可见性GONE).

  • 但是,如果必须滑入,我该怎么办?因为它实际上没有移动然后我怎么能滑动我有slideOut的对象??? (4认同)
  • slideLeftOut.setFillAfter(true)? (4认同)

小智 28

我可能在回复方面有点迟,但我有解决方案:

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

  • 它不适用于翻译动画.它仅适用于Scale Animation. (15认同)

Hay*_*yan 9

您可以使用

fillAfter=true
fillEnabled=true
Run Code Online (Sandbox Code Playgroud)

您的视图将不会重置为原始位置,但如果您的视图中有某些按钮或其他内容,则其位置不会更改.

你必须使用ObjectAnimator,它从API 11级别开始工作.它会自动更改View位置,

这是一个例子

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX);
objectAnimator.setDuration(1000);
objectAnimator.start();
Run Code Online (Sandbox Code Playgroud)

谢谢JUL的回答

如果没有找到你的应用程序object animator,改变从API级别Project -> properties -> Android,比import android.animation.ObjectAnimator;

关心海克


小智 7

您需要添加以下命令:

final Animation animSlideLeft = new TranslateAnimation(0, -80, 0,-350, 0, 0, 0, 0);
animSlideLeft.setFillAfter(true);
Run Code Online (Sandbox Code Playgroud)