Android第一次动画不流畅。

5

我正在尝试一种动画,将imageView从屏幕底部滑动到屏幕中心,但是当我第一次执行此动画时,它不流畅,但是第二次执行动画时,它正常且流畅。我几乎尝试了所有方法,但无法解决问题。

这是我的anim文件

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

这是我在片段上展示的方式。
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {
    private Animation anim;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startAnimations();
    }

    private void startAnimations() {
        anim = AnimationUtils.loadAnimation(this, R.anim.slide_up_animation);
        ImageView imageView = (ImageView) findViewById(R.id.splash);
        imageView.startAnimation(anim);
    }
}
4个回答

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

那么在哪里调用startAnimation方法呢? - Vinod Pattanshetti
从你的代码片段中,调用了一个名为onActivityCreated()的方法。 - Shahbaz Akhtar
这就是为什么我问你在Fragment的生命周期方法中何时调用startAnimation方法的原因。 - Vinod Pattanshetti
请在您的片段中重写onActivityCreated()方法。在其中,您可以执行任何您想要的动画。为了更好地理解,请查看片段生命周期。 - Shahbaz Akhtar
尽管不太顺畅,但我在onActivityCreated()中称之为under。 - Vinod Pattanshetti

1

记住Activity的生命周期,onCreate()创建视图,在此方法中显示动画会导致一些延迟。第一次动画不会很流畅。为了解决这个问题,你应该在onStart()方法或onResume()方法中进行动画,这是您的活动创建并完全准备好供用户查看的时间。

这是展示动画的最佳时机。

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

代码if(!anim.hasStarted())被添加是因为经常发生活动进入后台然后返回前台,调用onResume()。因此,您必须检查动画是否已经启动。如果它早期已经开始了,那么就不需要再次启动它。(这是无限动画的情况
对于有限动画,您还需要使用 onPause()方法。我会让您自己完成这部分。(思考@NamNH在您的另一个问题中提到的内容。编辑 第一次时,活动的外观和动画同时执行,这会导致延迟。因此,您应该将动画放在某个处理器中,并在几毫秒后执行它。
@Override
    public void onResume(){
        super.onResume();

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

这样做可以使动画有足够的时间顺利启动。希望这能帮到你。

@jackjay,我尝试了你的代码,但是它不能正常工作...在某些设备上,图像第一次动画效果不够流畅。 - Vinod Pattanshetti
这是一个适当的解决方案,尽管您仍然面临问题。如果可能的话,您能给我展示一下您的首次动画吗? - jack jay
@VinodPattanshetti请查看答案。 - jack jay
在处理程序中调整时间。我认为200毫秒已经足够好了。 - jack jay

0
确保的第一件事是不要在主线程上进行任何繁重的工作,如果需要执行该操作,可以将其移至后台线程。
由于您提到了在片段中显示,因此应将动画代码放置在以下方法中。这将确保仅在片段处于活动状态时才进行动画处理。另外,您应该始终在onDestroy()中停止动画。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
  super.setUserVisibleHint(isVisibleToUser);
}

-1

原因是因为你正在开始阶段这样做,

使用:

try {
    Thread.sleep(400);
} catch (InterruptedException e) {
    e.printStackTrace();
}
startAnimations();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接