3

在我要求视图无效后,我希望在视图完成重绘后收到通知。正如在这个答案中所说,该invalidate()方法不会onDraw()立即调用 View 的 UI,而是在主线程空闲后执行的消息队列中安排重绘。

我想显示一个进度对话框,进行一些 UI 修改,然后在正确绘制视图时关闭对话框。有什么技巧可以让我知道何时绘制视图?也许通过子类化视图,覆盖onDraw()方法?

4

2 回答 2

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();
}

如果您查看源代码:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/view/View.java#View.invalidate%28%29

上面的评论说

使整个视图无效。如果视图是可见的,onDraw(android.graphics.Canvas) 将在未来的某个时候被调用。这必须从 UI 线程调用。要从 > 非 UI 线程调用,请调用 postInvalidate()。

试试看 :)

编辑:可能你想使用回调来处理这个。

于 2012-12-08T17:27:07.317 回答
4

你会觉得尝试这样做很奇怪,因为你做错了。;)

您正在谈论要等待关闭对话框,直到完成绘制。这意味着您有一个足够长的绘图操作,您想要等待它。

在 onDraw 中绘制框架应该很快。如果您想达到 60fps 并拥有流畅的 UI,那么您每帧有 16 毫秒的时间来进行任何类型的输入处理和绘图。绘图永远不会花费足够长的时间,以至于您希望在完成时显示进度对话框。(除此之外,由于部分 UI 无效而导致的绘制会阻塞您的 UI 线程,并且您的进度对话框在完成之前不会说明任何进度。)

如果您需要进行一些复杂的离屏渲染以便稍后显示,您应该在 AsyncTask 或 UI 线程之外的类似操作中进行,而不是在视图的实际 onDraw 方法中进行。一旦你得到完成的回调,你可以快速绘制你刚刚创建的预渲染图像并关闭你的进度对话框。

于 2012-12-08T17:36:46.540 回答