我已经回到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()
也有效。
答案 0 :(得分:1)
触摸事件的任何回调都在UI线程上。您的理解是正确的,但您对正在使用的线程有误。如果这是在后台线程上,您将使用postInvalidate()。
要记住的一件事是,您在Activity类中拥有的代码不一定在UI线程上运行。当文档讨论在UI上运行时,这意味着必须在UI线程上执行代码。可以使用几种不同的方法在UI线程上运行任何类中的任何代码。考虑到这一点,可以在UI线程和后台线程中执行相同的代码。查看下面的示例,它将存在于Activity中。
UI线程:
runOnUiThread(new Runnable() {
myFunction();
});
后台主题:
new Thread(new Runnable() {
myFunction();
}).start();