Android第一次动画不流畅

时间:2017-06-11 06:32:37

标签: android android-animation

我正在尝试一个动画从屏幕底部向屏幕中心向上滑动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>

以及我在片段上的显示方式

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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

记住活动生命周期,ControlTemplate创建视图,并且您在此方法中显示动画,这会引入一些延迟。第一次动画不会流畅。要解决此问题,您应该使用<button type="button" class="btn btn-danger btn-lg no-border" id="foo"> <a href="#"> <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>foo! </a> </button> 方法或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()方法。我将留下这部分给你做。(This is for infinte animation

<强>编辑

第一次,活动和动画的外观一起执行,从而产生滞后。因此,您应该将动画放在某个处理程序中,并在几毫秒后执行它。

onPause()

这将为动画提供适当的时间来顺利开始。希望这会对你有所帮助。

答案 2 :(得分:0)

要确保的第一件事是你没有在你的主线程上做任何繁重的工作。如果需要什么,你可以将它移动到后台线程。

由于您已经提到在片段中显示,您应该将动画代码放在以下方法中。它将确保仅在片段处于活动状态时才会发生动画。此外,您应该始终在onDestroy()中停止动画。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
  super.setUserVisibleHint(isVisibleToUser);
}

答案 3 :(得分:-1)

原因是因为你在一开始就这样做了,

使用:

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