2012-03-20 81 views
2

所以我一直在做一些阅读过去几个小时,我明白,在Drawable/ImageView完全附加之前调用AnimationDrawable的start()将不会启动动画。这看起来与通常的UI初始化过程非常一致(例如在添加视图之后视图的维度立即返回为0)。在ListView项目中启动AnimationDrawable。项目何时连接?

我想象一下,当我尝试从适配器的getView()方法启动动画时,这个相同的问题是错误的。使用执行start()调用的延迟Runnable解决了这个问题,但显然不是一个理想的解决方案。

一旦ListView的项目“完全附加”,有什么办法可以接收回调吗?

+0

你有没有尝试覆写[http://developer.android.com/reference/android/view/View.html#onAttachedToWindow()](http://developer.android.com/reference/android/view/View的.html#onAttachedToWindow())? – sastraxi 2012-03-23 18:16:43

回答

4

根据documentation,您必须等到View附加到窗口,然后再开始动画。因此,您应该添加一个OnAttachStateChangeListener到视图中,该视图将在附加时执行,并从那里开始动画。

ImageView loadingImg = (ImageView)v.findViewById(R.id.image); 
loadingImg.setBackgroundResource(R.drawable.progressdialog); 
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
    public void onViewAttachedToWindow(View v) { 
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground(); 
    loadingAnimation.start(); 
    } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 
    } 
}); 

我试着开始在Viewpost()方法在Runnable动画,并没有奏效。上述方法是我可靠地以ListView开始动画的唯一方法。