Android的动画:等到吃完了吗?

我想等到动画结束*在Android ImageView的继续执行程序之前,什么是做到这一点的正确方法?

  • (本文中的“完成”指的是它贯穿其所有的帧恰好一个时间和停在最后一个我不清楚这个动画是否将是一个机器人:单稳=“真”的动画,因为我将使用它的多个次,但它不会被连续地但间歇地运行)

研究/猜测:

A.在心脏,我的问题似乎是一个Java线程的问题,因为Android的AnimationDrawable实现了java.lang.Runnable。 因此,也许线程解决方案。 也许答案将包括加入?

B.人的做法似乎已经使用AnimationListener,这似乎很难和我的简单的需求不必要的复杂。 加上我不完全知道如何做到这一点。

C.该AnimationDrawable类有一个(布尔)isRunning方法,或许可以在while循环使用(即同时(anim.isRunning()){等待(100毫秒)})。 但我有一个感觉:这是错误的做法。 虽然类似的东西似乎并发教程中被提及

代码段

this.q_pic_view.setImageResource(0); this.q_pic_view.setBackgroundResource(R.drawable.animation_test); AnimationDrawable correct_animation = (AnimationDrawable) this.q_pic_view.getBackground(); correct_animation.start(); //here I tried to implement option C but it didn't work while(correct_animation.isRunning()){ try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

动画

<?xml version="1.0" encoding="utf-8"?> <animation-list android:id="@+id/AnimTest" android:oneshot="true" xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/animtest001" android:duration="33"/> <item android:drawable="@drawable/animtest002" android:duration="100"/> <item android:drawable="@drawable/animtest003" android:duration="66"/> <item android:drawable="@drawable/animtest004" android:duration="66"/> <item android:drawable="@drawable/animtest005" android:duration="33"/> <item android:drawable="@drawable/animtest006" android:duration="66"/> <item android:drawable="@drawable/animtest007" android:duration="33"/> <item android:drawable="@drawable/animtest008" android:duration="66"/> <item android:drawable="@drawable/animtest009" android:duration="100"/> <item android:drawable="@drawable/animtest010" android:duration="100"/> </animation-list>

一种可能的方式,以达到预期的效果,虽然没有回答我的问题,是做这样的事情耽误进一步代码的执行:

int duration = 0; //Add all of the frames together for (int i=0; i<my_animation.getNumberOfFrames(); i++){ duration = duration + correct_animation.getDuration(i); } //delay the execution Handler handler = new Handler(); handler.postDelayed(new Runnable(){ public void run() { DoYourNextStuff(); } }, duration); //delay is here

编辑:有许多方法来解决这个问题,可能给出的答案确实解决我没有测试它的问题,但我最终只是在等待正确的时间量(起初),后来我改成使用异步任务(其中有完成一个处理方法),并跑到我的动画直接异步任务的UpdateProgress电话。 在最后一次迭代我使用的螺纹面视图运行动画。 最后的方法是迄今为止最快最好的(因为其他原因那么那些在这篇文章中问)。 我希望这可以帮助别人。

--------------解决方案-------------

建议你

  • 创建一个对象来封装“动画”终身
  • 在对象,你就会有一个线程或计时器
  • 提供方法来start()的动画和awaitCompletion()
  • 使用private final Object completionMonitor现场跟踪完成后, synchronize就可以了,并且使用wait()notifyAll()协调awaitCompletion()

代码片段:

final class Animation {

final Thread animator;

public Animation()
{
animator = new Thread(new Runnable() {
// logic to make animation happen
});

}

public void startAnimation()
{
animator.start();
}

public void awaitCompletion() throws InterruptedException
{
animator.join();
}
}

你也可以使用一个ThreadPoolExecutor使用一个线程或ScheduledThreadPoolExecutor ,并捕捉动画作为每一帧Callable 。 提交的序列Callable S和使用invokeAll()CompletionService来阻止你感兴趣的线程,直到动画完成。

最简单的方法是将发布(延迟)的Runnable到UI线程:

Animation fadeout = new AlphaAnimation(1.f, 0.f);
fadeout.setDuration(500);
view.startAnimation(fadeout);
view.postDelayed(new Runnable() {
@Override
public void run() {
view.setVisibility(View.GONE);
}
}, 500);

这将怕疼做的工作。 从不(永远,永远,永远!)试图阻止Android中UI线程。 如果你这样做了,手机死机,你不会看到动画反正。 如果你需要等待一段时间,使用另一个线程。

使用动画听者听动漫生命周期挂钩。

Animation fadeout = new AlphaAnimation(1.f, 0.f);
fadeout.setDuration(500);
final View viewToAnimate = view;
fadeout.setAnimationListener(new AnimationListener(){

@Override
public void onAnimationStart(Animation animation){}

@Override
public void onAnimationRepeat(Animation animation){}

@Override
public void onAnimationEnd(Animation animation){
viewToAnimate.setVisibility(View.GONE);
}
});
view.startAnimation(fadeout);

在另一种替代方案是使用ObjectAnimator。 还是如其他人所说,你将不得不使用一个听者

//get an image resource
ImageView imgView = (ImageView) findViewById(R.id.some_image);
//create and init an ObjectAnimator
ObjectAnimator animation;
animation = ObjectAnimator.ofFloat(imgView, "rotationY", 0.0f, 360f);

//set the duration of each iteration
animation.setDuration(1500);
//set number of iterations
animation.setRepeatCount(1);
//set setInterpolator

animation.setInterpolator(new AccelerateDecelerateInterpolator());
//Add a listner to check when the animation ends
animation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
//postFirstAnimation(): This function is called after the animation ends
postFirstAnimation();
}
});
//start the animation
animation.start();

分类:java的 时间:2013-10-18 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 3.337 (s). 10 q(s)