【问题标题】:Animation not starting until UI updates or touch event直到 UI 更新或触摸事件才开始动画
【发布时间】:2018-10-10 19:40:00
【问题描述】:

AlphaAnimation 有一个奇怪的问题。它应该在调用AsyncTask 处理程序时重复运行。

但是,第一次在 Activity 中调用处理程序时,除非我触摸屏幕或更新 UI(例如通过按下手机的菜单按钮),否则动画不会开始。

奇怪的是,一旦动画至少运行了一次,如果再次调用处理程序,它将毫无问题地启动。

代码如下:

// AsyncTask handler
public void onNetworkEvent()
{
  this.runOnUiThread(new Runnable() {
    @Override
    public void run()
    {
      flashScreen(Animation.INFINITE);
    }
  });
}

// Called method
private void flashScreen(int repeatCount)
{
  final View flashView = this.findViewById(R.id.mainMenuFlashView);

  AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
  alphaAnimation.setRepeatCount(repeatCount);
  alphaAnimation.setRepeatMode(Animation.RESTART);
  alphaAnimation.setDuration(300);
  alphaAnimation.setInterpolator(new DecelerateInterpolator());
  alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation)
    {
      flashView.setVisibility(View.VISIBLE);
    }

    @Override
    public void onAnimationEnd(Animation animation)
    {
      flashView.setVisibility(View.GONE);
    }

    @Override
    public void onAnimationRepeat(Animation animation) { }
  });

  flashView.startAnimation(alphaAnimation);
}

我注意到runOnUIThread 不是必需的(如果我不使用它会产生相同的结果),但我更喜欢保留它,因为我不在 UI 线程上。

关于什么可能导致这种情况的任何想法?

【问题讨论】:

  • 代码太少,无法理解您的调用顺序。您可以发布围绕Asynctask执行的部分吗?另外,您是否尝试过将条目记录到相关方法以查看发生了什么?
  • 第一次尝试将动画延迟几秒钟。在视图准备好之前尝试运行动画时可能会出现这种情况。

标签: android android-animation android-ui


【解决方案1】:

更多研究表明我的问题与这个问题相同: Layout animation not working on first run

flashView 的可见性默认设置为GONE(导致Animation 不会立即启动,因为View 从未被渲染),所以我只需要将其设置为INVISIBLE在打电话之前flashView.startAnimation()

【讨论】:

  • 谢谢,让 INVISIBLE 帮助我。
【解决方案2】:

如果将View 设置为VISIBLE 不起作用,就像我的情况一样,它有助于我在启动Animation 之前调用requestLayout(),如下所示:

Animation an = new Animation() {
...   
view.requestLayout();
view.startAnimation(an);

在我的情况下,我的 View0dip 高,这阻止了 onAnimationStart 被调用,这帮助我解决了这个问题。

【讨论】:

  • 在某些版本的 Android 上,如果初始视图的高度或宽度值为 0dip,它也不起作用。在我的一个案例中,我不得不将初始值设为 1dip,并且由于边距,视图不可见。这很有帮助,动画适用于所有版本。
【解决方案3】:

这对我有用:

view.setVisibility(View.VISIBLE);
view.startAnimation(animation);

我不得不将view 设置为VISIBLE(不是INVISIBLE,也不是GONE),导致视图渲染需要对其进行动画处理。

【讨论】:

    【解决方案4】:

    这不是一件容易的事。直到你得到真正的答案:动画开始由 onNetworkEvent 触发。由于我们不知道其余代码,您应该查看那里,尝试通过您可以轻松识别的其他事件更改 onNetworkEvent,只是为了调试其余代码是否正常或者它只是触发器对此负责。

    【讨论】:

    • 我可以很容易地触发它,并且它正在工作。调试显示 AnimationListeneronAnimationStart 在我第一次与 UI 交互之前不会被调用。
    • @Jukurrpa 这个问题适用于所有 Android 版本还是某些特定版本?
    • @Kai 我只有 4.1 和 4.2 的设备可以试用,而且两者都可以。
    • 所以onAnimationSart没有被调用...也许你可以尝试把flashView.startAnimation(alphaAnimation);在 flashScreen(Animation.INFINITE); 之后直接进入 public void 运行;
    【解决方案5】:

    可能会对某人有所帮助,因为以前的答案对我没有帮助。

    我的动画在点击时改变了视图的高度(从 0 到它的真实高度并返回) - 展开和折叠动画。

    在我添加监听器并将可见性设置为 GONE 之前,没有任何效果,当动画结束时:

    collapseAnim.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
    
            }
    
            @Override
            public void onAnimationEnd(Animation animation) {
                view.setVisibility(View.GONE);
            }
    
            @Override
            public void onAnimationRepeat(Animation animation) {
    
            }
        });
    

    当展开时,只需在动画前将其设置为可见:

     view.setVisibility(View.VISIBLE);
     view.startAnimation(expandAnim);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多