动画无法启动,直到UI更新或触摸事件(Animation not starting until UI

2019-09-01 05:24发布

我有一个奇怪的问题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线程上。

什么任何想法可能会导致此?

Answer 1:

阿多的研究表明,我的问题就是这个问题同一个: 在第一次运行不工作布局动画

flashView的知名度设为GONE默认(导致Animation不立即作为开始View从来没有被渲染),所以我只是需要将其设置为INVISIBLE调用之前flashView.startAnimation()



Answer 2:

如果设置ViewVISIBLE是行不通的,因为在我的情况下,它帮助我打电话requestLayout()开始前, Animation ,就像这样:

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

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



Answer 3:

这为我工作:

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

我不得不设置viewVISIBLE (不是INVISIBLE ,既不GONE ),导致它的动画所需的视图renderization。



Answer 4:

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



Answer 5:

可能它会帮助别人,因为以前的答案没有帮助我。

我的动画是改变视图高度(从0到它的实际高度和背面)上点击 - 展开和折叠动画。

没有工作,直到我加入监听器,并设置能见度消失了,当动画结束:

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);


文章来源: Animation not starting until UI updates or touch event