usniyo 2013-05-09 02:24 采纳率: 0%
浏览 8325

关于Android View与Drawable的问题,求高人解惑

调用View.invalidate()方法,就会请求View重新draw()。可是我看了invalidate()与相关的方法,并没有与draw()有直接的关系。请问invalidate()是如何使View重新draw()的?

Drawable.mutate()方法为了不产生新的对象,直接返回了它自身。既然是这样,那为什么mutate()以后同一个图像资源能够有不同的常态(比如透明度)?在BitmapDrawable中在第一次mutate()的时候新生成一个BitmapState常态,后面的就是直接返回它自身了。第一次常态对象改变了倒还可以理解,可后面的我就不明白了。求高人解惑,非常感谢!

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-24 17:48
    关注

    View.invalidate() 方法会将该视图标记为无效,这意味着系统会在下一次重绘视图时调用该视图的 draw() 方法。重绘视图通常是在主线程的下一个界面更新期间触发的。


    关于 Drawable.mutate() 方法,它主要是为了让调用者在使用相同的图像资源时能够对其进行不同的设置。如果在使用相同的图像资源时未调用 mutate() 方法,则可能会出现意料之外的结果,因为资源的属性值是共享的。


    例如,如果有一个图像资源,并使用它创建了两个 Drawable 对象,则对其中一个对象设置的颜色可能会影响另一个对象的颜色。这是因为图像资源的属性值是共享的,因此对其中一个对象的更改会影响另一个对象。


    mutate() 方法可以解决这个问题,因为它会创建一个新的 Drawable 对象,其中包含与原始对象相同的图像资源,但属性值是独立的。这样,就可以对两个 Drawable 对象进行不同的设置,而不会相互影响。


    在 BitmapDrawable 中,第一次调用 mutate() 方法时会创建一个新的 BitmapState 对象,因为在这之前并没有一个独立的属性值,所以必须创建一个新的对象来存储这些值。


    但是,当 mutate() 方法再次被调用时,就不再需要创建新的对象,因为已经有了一个独立的属性值。因此,mutate() 方法会直接返回它自身,以便调用者可以继续对其进行设置。


    总的来说,invalidate() 方法是通过将视图标记为无效,在下一次重绘视图时调用其 draw() 方法来使视图重新绘制的。mutate() 方法是为了允许使用相同的图像资源时对其进行不同的设置,而无需担心属性值的共享会导致意料之外的结果。

    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题