当 属性 以编程方式更改为相同的值时,视图是否会重绘?

Does View gets redrawn when property programatically changed to same value?

让我们在片段中添加一些视图(例如 LinearLayout 或 ImageView)。如果我以编程方式将此视图的 属性 更改为已设置的相同 属性(例如更改背景颜色),则视图 redrawn/rerendered?

双集示例:

binding.someLinearLayout.setBackgroundColor(redColor)
binding.someLinearLayout.setBackgroundColor(grayColor);
binding.someLinearLayout.setBackgroundColor(grayColor);
binding.someLinearLayout.setBackgroundColor(grayColor);

LinearLayout会重绘2次还是4次?如果是 4 次,我是否应该实施类似的措施来防止它?

fun setBackgroundColor(ll: LinearLayout, color: Int){
   val current = binding.progressBarChunk4.background as ColorDrawable
   if(current.getColor() != color)
      ll.setBackgroundColor(color)
}

setBackgroundColor(binding.someLinearLayout, redColor); // Color set
setBackgroundColor(binding.someLinearLayout, grayColor); // Color set
setBackgroundColor(binding.someLinearLayout, grayColor); // ignored
setBackgroundColor(binding.someLinearLayout, grayColor); // ignored

所以基本上我问的是多组相同的 属性 是否会影响性能,因为视图每次都会重绘。

如果你像这样连续四次调用setBackgroundColor,它不会导致四次重绘。在当前函数返回后,视图仅在主线程的下一个循环中重绘一次。

更改这些属性通常会使视图无效,因此您对 setBackgroundColor 的第一次调用将在主线程的下一个循环中触发重绘,即使它与现有颜色匹配。我不能保证核心视图中每个现有的 属性 都是如此,因为我还没有检查它们。 setBackgroundColorsetText 绝对正确。

您对当前颜色的防御性检查可能会阻止不必要的重绘,但前提是您最终不会在主线程的这次迭代中改变任何视图。我想不出值得担心的情况。如果这是在 onCreate()onViewCreated() 中,无论如何视图都还没有绘制。如果这是在点击监听器中,您的视图无论如何都会被重绘,因为您的按钮的视觉状态正在改变。

对影响视图大小的更改进行防御性检查可能是值得的,因为那样您可能会阻止重新布局。但可能只有在某些动画期间才会发生这种情况,否则节省的费用不会很明显。