2

我正在使用 Matrix 在屏幕上旋转 PNG 图像。我想将旋转操作移动到一个单独的线程,这样 UI 线程就不会受到它的负担。但这提出了一些有趣的问题。

一旦将矩阵应用于 ImageView,我预计需要调用 invalidate()。但是,旋转后的图像在屏幕上显示得很好——而且我从不调用 invalidate()。没有触摸区域,我所做的任何事情都不会明确告诉 UI 刷新屏幕。是什么在刺激 UI 线程更新显示?UI 线程是否神奇地“知道”显示需要更新(因此不需要显式调用 invalidate()),因为 IT 是线程接触作为显示一部分的对象?

当我将旋转移出 UI 线程时,我将操作 UI 用来渲染屏幕的同一个 ImageView。这听起来像是一个需要同步的经典线程冲突问题(因为同一个对象将被多个线程访问)。但是由于上述行为,我不确定如何处理。由于 UI 线程似乎“神奇地知道”屏幕需要更新,我是否需要同步 - 或者单独的线程是否只是在视图上调用 invalidate() 并且会处理它?

谢谢!

4

2 回答 2

2

我相信它postInvalidate()来自非 UI 线程,而不是invalidate()在 UI 线程上。

但是,是的。

只需调用它,它将在下一次给定的机会时更新。

于 2013-07-15T15:57:59.727 回答
0

您不必调用 invalidate 的原因是setImageDrawableImageView 的(和类似方法)方法已经使自己无效。

此外,在单独的线程中修改 View 是个坏主意。将 View 操作移入onPostExecute并将 Bitmap 操作保留在doInBackground.

于 2013-07-15T16:01:30.270 回答