Android - 在重写invalidate()之后的监听器

时间:2012-12-08 17:19:48

标签: android android-view

我希望在视图完成重绘后得到通知,我要求它无效。如this answer中所述,invalidate()方法不立即调用视图的onDraw() UI,而是在主线程空闲之后执行的消息队列中调度重绘。

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

2 个答案:

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

如果你看一下来源:

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()。

尝试一下:)

编辑:可能你想使用Callback来处理这个问题。

答案 1 :(得分:3)

你发现尝试这样做很奇怪,因为你说这一切都错了。 ;)

你正在谈论想要等到完成绘图之后才解雇对话框。这意味着你有一个足够长的绘图操作,你想等待它。

在onDraw中绘制一个框架应该快。如果你想达到60fps并拥有流畅的用户界面,你每帧有16毫秒可以进行任何类型的输入处理和绘图。绘图永远不会花费足够长的时间,以便在完成时显示进度对话框。 (除此之外,绘制因无效部分UI阻止你的UI线程,你的进度对话框无法说明任何进展,直到它完成。)

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