Android第一次动画不流畅
我正在尝试一个动画向上滑动imageView从屏幕底部到屏幕中心,但当我第一次做这个动画时,它并不平滑,但当第二次做动画时,它是正常和平滑的。我几乎什么都试过了,但解决不了我的问题 这是我的动画文件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"> &
<?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();