动画直到UI更新或触摸事件才开始

Juk*_*rpa 27 android android-ui android-animation

我有一个奇怪的问题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);
}
Run Code Online (Sandbox Code Playgroud)

我注意到runOnUIThread没有必要(如果我不使用它会发生相同的结果),但我更喜欢保留它,因为我不在UI线程上.

有什么可能导致这个问题的想法?

Juk*_*rpa 46

更多的研究表明我的问题与此问题相同: 布局动画在首次运行时无效

flashView"可见性设置为GONE默认(导致Animation不能立即作为开始View从来没有被渲染),所以我只是需要将其设置为INVISIBLE呼叫前flashView.startAnimation()


Zeb*_*baz 26

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

Animation an = new Animation() {
...   
view.requestLayout();
view.startAnimation(an);
Run Code Online (Sandbox Code Playgroud)

就我而言,我的View0dip它阻止高onAnimationStart被调用,这帮助我身边的这个问题.

  • 在某些版本的Android上,如果视图的高度或宽度的初始值为0dip,则它不起作用.在我的一个案例中,我必须创建1dip的初始值,并且由于边距,视图不可见.这有助于,动画适用于所有版本. (3认同)