我对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线程上。
关于可能导致这种情况的任何想法?
答案 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);
在我的情况下,View
为0dip
高,阻止了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);