2013-04-26 64 views
22

我有一个奇怪的问题,AlphaAnimation。当调用AsyncTask处理程序时,它应该重复运行。直到UI更新或触摸事件才开始动画

但是,第一次在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线程上。

有什么想法可能导致这种情况?

+0

太少的代码来理解你的呼叫顺序。你能发布围绕Asynctask执行的部分吗?另外,您是否尝试将条目记录到相关方法以查看发生了什么? – ilomambo 2013-04-26 14:50:22

+0

尝试第一次延迟动画几秒钟。在视图准备好之前尝试运行动画时,可能会出现这种情况。 – 2013-04-26 14:51:01

回答

39

多一点的研究表明,我的问题是一样的一个这样的问题: Layout animation not working on first run

flashView的知名度被默认设置为GONE(导致Animation不立即开始为View从未渲染),所以我只需要调用flashView.startAnimation()

+0

谢谢,让INVISIBLE帮助了我。 – Vasanth 2015-02-23 10:59:13

0

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

+1

我可以很容易地触发它,它正在工作。调试表明,在我第一次与UI交互之前,不会调用AnimationListener的'onAnimationStart'。 – Jukurrpa 2013-04-26 14:31:24

+0

@Jukurrpa此问题是否适用于所有Android版本或某些特定版本? – Kai 2013-04-26 14:34:04

+0

@Kai我只有4.1和4.2的设备可以使用它,并且它在两者上都可以。 – Jukurrpa 2013-04-26 14:39:59

21

如果设置ViewVISIBLE将无法​​正常工作,因为在我的情况下,它帮助我在开始日前将调用requestLayout()之前将其设置为INVISIBLE ËAnimation,就像这样:

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

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

+2

在某些版本的Android上,即使它的高度或宽度视图的初始值为0dip,它也不起作用。在我的一个案例中,我不得不初始化1dip,并且因为保证金,视图不可见。这有助于动画在所有版本中都可用。 – Oknesif 2014-10-15 13:29:03

1

这为我工作:

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

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