1

我一直在回到 Android 操作系统,并决定研究画布和绘画。

我在这里遇到了一些创建简单绘图应用程序的代码。但我对一件事有点困惑。在绘画类中它这样做:

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 - 主要活动是?只是想就此发表意见。

PS我都试过了,postInvalidate()也可以。

4

1 回答 1

1

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

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

用户界面线程:

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

背景话题:

    new Thread(new Runnable() {
            myFunction();
    }).start();
于 2013-06-04T14:34:25.577 回答