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

时间:2013-04-26 14:06:54

标签: android android-animation android-ui

我对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线程上。

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

5 个答案:

答案 0 :(得分:45)

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

flashView的可见性默认设置为GONE(导致Animation无法立即启动,因为View从未渲染过,所以我只是在调用INVISIBLE

之前,需要将其设置为flashView.startAnimation()

答案 1 :(得分:26)

如果将View设置为VISIBLE无法正常工作,就像我的情况一样,在启动requestLayout()之前,我有必要致电Animation,就像这样:

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

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

答案 2 :(得分:2)

这对我有用:

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

我必须将view设置为VISIBLE(不是INVISIBLE,而不是GONE),从而导致为其设置动画所需的视图渲染。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

我的动画是在单击时更改视图的高度(从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);