Java Graphics.drawImage()如何工作以及ImageObserver的作用是什么

如何使用Java的drawImage()? 我没有找到JDK文档。 例如,所有drawImage签名都需要一个ImageObserver,但是这个文档对新用户没有多大帮助。

你可以使用Graphics.drawImage(img, x, y, null) [或类似]。 ImageObserver参数是一个回调函数,用于通知您绘制操作的进度; 并且只有在异步获取Image参数时才真正有用。

更清楚的是,如果使用未完全加载的Image调用drawImage ,它将:

  1. 返回false(立即)
  2. 绘制尽可能多的Image (所有加载的)
  3. 并且,在将来的某个时刻,当更多图像可用时调用ImageObserver

基本上,如果您正在使用内存Image (从文件系统加载,或由程序构建),请不要担心ImageObserver参数。 如果您正在通过网络加载Image并且没有明确等待它们加载,则需要使用ImageObserver来确保“完全”绘制Image

Image对象不一定完全加载。 如果在不完整的图像上调用Graphics.drawImage ,它将尽可能多地绘制图像,然后在加载更多图像时警告ImageObserver (通过调用imageUpdate )。

ImageObserver可以为null,在这种情况下,您将不会收到任何通知。 如果已知图像已加载,或者已经有另一种机制进行重新绘制,则这种情况很常见。

请注意, Component实现了ImageObserver ,其imageUpdate方法将在受影响的区域上repaint

实际上我多次使用drawImage()ImageObserver参数设置为null 。 好吧,这并不意味着它没用,但我在不知道它的用途的情况下做了我需要的任何事情。

正如其他人所暗示的那样,当假设将要呈现的图像将通过网络加载时,构思了这个API。 当您要求工具包加载图像时,假设它只是一个shell,并且知道其大小和像素所需的字节仍然在线上爬行。

在这种情况下,drawImage在第一次调用时可能不会呈现任何内容。 随着大小和像素变得可用,将通知ImageObserver。 在Component implements ImageObserver的情况下,其行为是在数据可用时重新绘制。