什么时候需要在View上执行invalidate()?

时间:2012-05-18 06:08:23

标签: android android-imageview android-view

我对this question的回答刚刚被接受,但我开始想知道究竟是什么时候需要使一个视图无效()以及什么时候不需要?

经过一番思考后,我意识到 或多或少会像这样工作:

  • “一切”的实际绘制发生在onResume()
  • 之后
  • 在“免费”时间部分屏幕可以重绘,但只有那些invalidated(及其下面的所有内容)

因此,如果我在onResume()之后更改某些内容(例如,作为对按钮点击的回复,我应invalidate()更改View)。

然而,从this question中的scana说,它必须比那更复杂,并且它取决于某些方法使用的方法。

E.g。是否使用

lastClicked.setImageBitmap();

lastClicked.setImageResource();

那么,什么时候需要在View上执行invalidate()以及它是如何工作的?

4 个答案:

答案 0 :(得分:69)

(请考虑接受一些答案)

通常,invalidate()表示“在屏幕上重绘”并导致调用视图的onDraw()方法。因此,如果某些内容发生变化并且需要在屏幕上反映出来,则需要致电invalidate()。但是,对于内置小部件,您很少需要自己调用它。当您更改窗口小部件的状态时,内部代码将根据需要调用invalidate(),您的更改将反映在屏幕上。例如,如果您在进行大量内部处理后调用TextView.setText()(文本是否适合屏幕,是否需要省略等),TextView将调用invalidate()setText()返回之前。同样适用于其他小部件。

如果您实施自定义视图,则只要支持模型发生更改并且您需要重新绘制视图,就需要调用invalidate()。它还可用于创建简单的动画,您可以在其中更改状态,然后调用invalidate(),再次更改状态等。

答案 1 :(得分:20)

通常,系统会自动处理小部件的大小调整,隐藏,显示和大量其他事情,但如果绘制的像素或后备数据的底层缓冲区已更改或过时(您交换图像资源,则有时会出现问题)视图或原始数据集更改)。发生这种情况是因为操作系统无法知道数据是以特定方式更改的。

在这些你正在处理绘图的情况下,你必须告诉系统它的底层数据与 Widget.invalidate()处于良好状态并且重新绘制排队就像你提到的主线程一样。根据系统实现和Android版本,系统更改跟踪的内容会有所不同,但我通常会假设系统资源(字节数组,字符数组,资源索引,上下文的手动绘图)未被跟踪,需要< em> invalidate ,其他一切都将由系统处理。

答案 2 :(得分:0)

请记住,在屏幕上绘图是经常进行的过程,每当您更新视图时,应该传播并重新绘制该更改以通知此类更改。 // return screenImage.SaveFile(filename, type); 是一种触发方法,用于表示强制重新绘制您希望显示更改的任何视图。

答案 3 :(得分:0)

当我想绘制textPaint时遇到了这个问题! 我的代码是

    canvas.drawPaint(textPaintNumber)
    canvas.drawText("MyText", 30F, 63F, textPaintNumber)

我清除了第一个皮棉,问题得到解决

    canvas.drawText("MyText", 30F, 63F, textPaintNumber)