当前位置: 首页 > 面试题库 >

Android动画:等到完成?

鲁熙云
2023-03-14
问题内容

我想等到Android ImageView中的动画完成*后再继续执行程序,这样做的正确方法是什么?

  • (在这种情况下,“完成”是指它恰好一次遍历所有帧,并在最后一帧停止。我不清楚该动画是否会是android:oneshot =“ true”动画,因为我将多次使用它时间,但不会连续而是间歇地运行)

研究/猜测:

答:从本质上讲,我的问题似乎是Java线程问题,因为Android
AnimationDrawable实现了Java.lang.Runnable。所以也许线程是解决方案。也许答案将包括加入?

B.其他人的方法似乎是使用AnimationListener,对于我的简单需求而言,这似乎很困难且不必要地复杂。另外,我不确定该怎么做。

C.
AnimationDrawable类具有一个(布尔)isRunning方法,该方法可能在while循环中使用(即while(anim.isRunning()){wait(100ms)})。但是我有一种直觉,认为这是错误的方法。尽管并发教程中似乎提到了类似的内容

代码段

   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。提交Callables
的序列,并使用invokeAll()或a CompletionService阻止您感兴趣的线程,直到动画完成。



 类似资料:
  • 问题内容: 我有一个脚本,需要在tomcat完成启动并准备开始部署应用程序之后运行。我正在使用哪个立即返回。我怎样才能等到tomcat完成启动? 问题答案: 可能有几种方法可以做到这一点。我们使用的技巧是: 希望这可以帮助!

  • 我执行一些由点击按钮触发的操作: 因此,基本上我只是隐藏一些< code >视图并显示一些其他视图,我的< code>EditText使用一组简单的< code >动画来“滑出”。 当操作被取消时,我会反转过程: 我想做的是将动画(反方向)应用于我的,因此它也会随着幻灯片动画消失。问题是所有代码都立即执行,因此在其动画完成之前就消失了。我尝试了一些奇怪的事情,比如使用并将动画放在方法中,在中设置的

  • 与不同,没有简单的方法来设置空视图,因此必须手动管理它,在适配器的项计数为0的情况下使空视图可见。 为了实现这一点,首先,我尝试在修改下垫结构(在我的示例中为)后立即调用空视图逻辑,例如: 它做了这件事,但有一个缺点:当最后一个元素正在被移除时,空视图出现在移除动画完成之前,在移除之后立即出现。所以我决定等到动画结束再更新UI。 令我惊讶的是,我找不到一个好的方法来收听RecycerView中的动

  • 问题内容: 我正在尝试为UIImageView设置动画,然后在动画完成后隐藏图像视图。但是,在动画完成之前imageview被隐藏了。我看过类似的问题,他们建议在完成后在动画代码中实现动画侦听器或执行.hidden代码,但是我不确定如何在下面的shockView()函数中影响此效果。 仅在动画完成后,如何显示摇动动画并隐藏图像视图? 使用以下代码调用动画: 动画功能本身如下所示: 问题答案: 动画

  • 我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种

  • 例:-操作栏上的搜索按钮被延迟到显示在操作栏上,在它显示的断言失败之前,它应该等待吗? 在Lollipop中,我们有一个波纹打击动画,然后显示一些视图,但断言失败,动画结束前,浓缩咖啡应该等待所有视图和动画变成空闲,对吗?当我使用自定义闲置资源和等待2秒的时间,它的工作,但这不是正确的方式。