调用View.invalidate()
方法,就会请求View
重新draw()
。可是我看了invalidate()
与相关的方法,并没有与draw()
有直接的关系。请问invalidate()
是如何使View
重新draw()
的?
Drawable.mutate()
方法为了不产生新的对象,直接返回了它自身。既然是这样,那为什么mutate()
以后同一个图像资源能够有不同的常态(比如透明度)?在BitmapDrawable
中在第一次mutate()
的时候新生成一个BitmapState
常态,后面的就是直接返回它自身了。第一次常态对象改变了倒还可以理解,可后面的我就不明白了。求高人解惑,非常感谢!
View.invalidate() 方法会将该视图标记为无效,这意味着系统会在下一次重绘视图时调用该视图的 draw() 方法。重绘视图通常是在主线程的下一个界面更新期间触发的。
关于 Drawable.mutate() 方法,它主要是为了让调用者在使用相同的图像资源时能够对其进行不同的设置。如果在使用相同的图像资源时未调用 mutate() 方法,则可能会出现意料之外的结果,因为资源的属性值是共享的。
例如,如果有一个图像资源,并使用它创建了两个 Drawable 对象,则对其中一个对象设置的颜色可能会影响另一个对象的颜色。这是因为图像资源的属性值是共享的,因此对其中一个对象的更改会影响另一个对象。
mutate() 方法可以解决这个问题,因为它会创建一个新的 Drawable 对象,其中包含与原始对象相同的图像资源,但属性值是独立的。这样,就可以对两个 Drawable 对象进行不同的设置,而不会相互影响。
在 BitmapDrawable 中,第一次调用 mutate() 方法时会创建一个新的 BitmapState 对象,因为在这之前并没有一个独立的属性值,所以必须创建一个新的对象来存储这些值。
但是,当 mutate() 方法再次被调用时,就不再需要创建新的对象,因为已经有了一个独立的属性值。因此,mutate() 方法会直接返回它自身,以便调用者可以继续对其进行设置。
总的来说,invalidate() 方法是通过将视图标记为无效,在下一次重绘视图时调用其 draw() 方法来使视图重新绘制的。mutate() 方法是为了允许使用相同的图像资源时对其进行不同的设置,而无需担心属性值的共享会导致意料之外的结果。