使用Android绘画 - invalidate()或postInvalidate()

时间:2013-06-04 14:29:27

标签: android paint

我已经回到Android操作系统并决定调查画布和绘画。

我遇到了一些代码here,它创建了一个简单的绘图应用程序。但我对一件事感到困惑。在paint类中,它执行此操作:

public boolean onTouch(View view, MotionEvent event) {

    // Point holds two integer coordinates
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();

    // Add the coordinates to the array list
    points.add(point);

    invalidate();

    Log.d(TAG, "point: " + point);
    return true;
}

根据invalidate()上的悬停讯息:

  

必须从UI线程调用此方法。要从非UI线程调用,请调用postInvalidate()。   使整个视图无效。   如果视图可见,将在某个时间点调用onDraw(android.graphics.Canvas)。必须从UI线程调用此方法。要从非UI线程调用,请调用postInvalidate()。

所以 - 不应该调用postInvalidate()而不是invalidate(),因为Paint类不是UI - 主要活动是?只是想对此有所了解。

P.S。我试过了两个,postInvalidate()也有效。

1 个答案:

答案 0 :(得分:1)

触摸事件的任何回调都在UI线程上。您的理解是正确的,但您对正在使用的线程有误。如果这是在后台线程上,您将使用postInvalidate()。

要记住的一件事是,您在Activity类中拥有的代码不一定在UI线程上运行。当文档讨论在UI上运行时,这意味着必须在UI线程上执行代码。可以使用几种不同的方法在UI线程上运行任何类中的任何代码。考虑到这一点,可以在UI线程和后台线程中执行相同的代码。查看下面的示例,它将存在于Activity中。

UI线程:

    runOnUiThread(new Runnable() {
            myFunction();
    });

后台主题:

    new Thread(new Runnable() {
            myFunction();
    }).start();