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