我希望在视图完成重绘后得到通知,我要求它无效。如this answer中所述,invalidate()
方法不立即调用视图的onDraw()
UI,而是在主线程空闲之后执行的消息队列中调度重绘。
我想显示进度对话框,进行一些UI修改,然后在正确绘制视图时关闭对话框。是否有一些技巧可以让我知道何时绘制视图?也许通过子类化视图,覆盖onDraw()
方法?
答案 0 :(得分:5)
我想你自己回答了你的问题。为什么不:
public class DrawListenerView extends View{
private Callback callback;
public DrawListenerView(Callback callback){
this.callback = callback;
}
@Override
protected void onDraw (Canvas canvas){
super.onDraw(canvas);
//add your method here you want to call
//Or use a Callback-pattern
callback.finish();
}
}
public interface Callback(){
public void finish();
}
如果你看一下来源:
上面的评论说
使整个视图无效。如果视图可见,将在以后的某个时刻调用onDraw(android.graphics.Canvas)。必须从UI线程调用此方法。要从>非UI线程调用,请调用postInvalidate()。
尝试一下:)
编辑:可能你想使用Callback来处理这个问题。
答案 1 :(得分:3)
你发现尝试这样做很奇怪,因为你说这一切都错了。 ;)
你正在谈论想要等到完成绘图之后才解雇对话框。这意味着你有一个足够长的绘图操作,你想等待它。
在onDraw中绘制一个框架应该快。如果你想达到60fps并拥有流畅的用户界面,你每帧有16毫秒可以进行任何类型的输入处理和绘图。绘图永远不会花费足够长的时间,以便在完成时显示进度对话框。 (除此之外,绘制因无效部分UI阻止你的UI线程,你的进度对话框无法说明任何进展,直到它完成。)
如果您需要执行一些复杂的屏幕外渲染以便稍后显示,则应该在AsyncTask或类似的UI线程中执行此操作,而不是在视图的实际onDraw方法中执行。从中获得完成的回调后,您可以快速绘制刚刚创建的预渲染图像并关闭进度对话框。