Android第一次动画不流畅

Android第一次动画不流畅,android,android-animation,Android,Android Animation,我正在尝试一个动画向上滑动imageView从屏幕底部到屏幕中心,但当我第一次做这个动画时,它并不平滑,但当第二次做动画时,它是正常和平滑的。我几乎什么都试过了,但解决不了我的问题 这是我的动画文件 <?xml version="1.0" encoding="UTF-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true"> &

我正在尝试一个动画向上滑动imageView从屏幕底部到屏幕中心,但当我第一次做这个动画时,它并不平滑,但当第二次做动画时,它是正常和平滑的。我几乎什么都试过了,但解决不了我的问题

这是我的动画文件

<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toAlpha="1.0" />
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="700"
        android:fromXScale="1"
        android:fromYScale="1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.5"
        android:toYScale="1.5"/>
    <translate
        android:fromXDelta="0%"
        android:toXDelta="0%"
        android:fromYDelta="300%"
        android:toYDelta="0%"
        android:duration="2000"
        android:zAdjustment="top" />
</set>

这是因为您在创建活动/片段时调用动画。尝试在创建片段后启动动画。从
onActivityCreated()

记住活动生命周期,
onCreate()
创建视图,并使用此方法显示动画,这会引入一些延迟。动画不会是第一次平滑。为了避免这种情况,您应该在
onStart()
方法或
onResume()
中进行动画制作,此时您的活动已创建并完全准备好供用户查看

这是播放动画的最佳时间

如果(!anim.hasStarted())添加了代码
,因为很多次活动在后台进行,然后调用
onResume()
。因此,您必须检查动画是否已启动。如果更早启动,则无需再次启动。(
这适用于infinte动画

对于有限动画,您还必须使用
onPause()
方法。我将把这部分留给你去做。(
想想@NamNH在你的另一个问题中提到了什么。

编辑

第一次,活动和动画的出现一起执行,这造成了延迟。所以你应该把你的动画放到一些处理器中,在几毫秒后执行

@Override
    public void onResume(){
        super.onResume();

        if(!anim.hasStarted()){
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    imageView.startAnimation(anim);
                },200);
        }
    }

这将使动画有适当的时间平稳启动。希望这会对您有所帮助。

首先要确保您没有在主线程上做任何繁重的工作。如果需要,您可以将其移动到后台线程

既然您提到了在片段中显示,那么您应该将动画代码放在下面的方法中。它将确保仅当片段处于活动状态时才会发生动画。此外,应始终在onDestroy()中停止动画


原因是因为你一开始就这么做

使用:


那么在哪里调用startAnimation方法?@VinodPattanshetti从您的片段。一个名为onActivityCreated()的方法,这就是为什么我要问您在片段的生命周期方法中在何处调用startAnimation方法。请重写片段onActivityCreated()中的方法。你应该做你想做的任何事情。为了更好地理解,请考虑片段生命周期。虽然它不平滑,但我将其称为onActivityCreated()。@jackjay我尝试了您的代码,但它不起作用…图像在某些设备上第一次动画制作不平滑。这是一个适当的解决方案,尽管您仍然面临问题。如果可能的话,你能给我看你的第一次动画吗?@VinodPattanshetti看到答案了。在handler中玩时间游戏。我认为200毫秒就足够了。
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        anim = AnimationUtils.loadAnimation(this, R.anim.slide_up_animation);
        ImageView imageView = (ImageView) findViewById(R.id.splash);

    }

    private void startAnimations() {
        if(!anim.hasStarted()){
             imageView.startAnimaition(anim);
        }
    }

    @Override
    public void onResume(){
         startAnimatons();
    }
@Override
    public void onResume(){
        super.onResume();

        if(!anim.hasStarted()){
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    imageView.startAnimation(anim);
                },200);
        }
    }
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
  super.setUserVisibleHint(isVisibleToUser);
}
try {
    Thread.sleep(400);
} catch (InterruptedException e) {
    e.printStackTrace();
}
startAnimations();