29

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

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

4

5 回答 5

50

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

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

于 2013-04-26T14:56:44.810 回答
30

如果设置ViewtoVISIBLE不起作用,就像我的情况一样,它有助于我requestLayout()在开始之前调用Animation,如下所示:

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

就我而言,我View的情绪0dip很高,无法onAnimationStart被调用,这帮助我解决了这个问题。

于 2014-01-10T00:17:38.043 回答
3

这对我有用:

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

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

于 2016-05-03T09:10:00.900 回答
0

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

于 2013-04-26T14:23:21.127 回答
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) {

        }
    });

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

 view.setVisibility(View.VISIBLE);
 view.startAnimation(expandAnim);
于 2018-10-10T11:40:00.100 回答