在我要求视图无效后,我希望在视图完成重绘后收到通知。正如在这个答案中所说,该invalidate()
方法不会onDraw()
立即调用 View 的 UI,而是在主线程空闲后执行的消息队列中安排重绘。
我想显示一个进度对话框,进行一些 UI 修改,然后在正确绘制视图时关闭对话框。有什么技巧可以让我知道何时绘制视图?也许通过子类化视图,覆盖onDraw()
方法?
在我要求视图无效后,我希望在视图完成重绘后收到通知。正如在这个答案中所说,该invalidate()
方法不会onDraw()
立即调用 View 的 UI,而是在主线程空闲后执行的消息队列中安排重绘。
我想显示一个进度对话框,进行一些 UI 修改,然后在正确绘制视图时关闭对话框。有什么技巧可以让我知道何时绘制视图?也许通过子类化视图,覆盖onDraw()
方法?
我想你自己回答了你的问题。为什么不:
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()。
试试看 :)
编辑:可能你想使用回调来处理这个。
你会觉得尝试这样做很奇怪,因为你做错了。;)
您正在谈论要等待关闭对话框,直到完成绘制。这意味着您有一个足够长的绘图操作,您想要等待它。
在 onDraw 中绘制框架应该很快。如果您想达到 60fps 并拥有流畅的 UI,那么您每帧有 16 毫秒的时间来进行任何类型的输入处理和绘图。绘图永远不会花费足够长的时间,以至于您希望在完成时显示进度对话框。(除此之外,由于部分 UI 无效而导致的绘制会阻塞您的 UI 线程,并且您的进度对话框在完成之前不会说明任何进度。)
如果您需要进行一些复杂的离屏渲染以便稍后显示,您应该在 AsyncTask 或 UI 线程之外的类似操作中进行,而不是在视图的实际 onDraw 方法中进行。一旦你得到完成的回调,你可以快速绘制你刚刚创建的预渲染图像并关闭你的进度对话框。