【问题标题】:Painting with Android - invalidate() or postInvalidate()使用 Android 绘画 - invalidate() 或 postInvalidate()
【发布时间】:2013-06-04 14:29:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android paint


    【解决方案1】:

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

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

    用户界面线程:

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

    后台线程:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多