当 属性 以编程方式更改为相同的值时,视图是否会重绘?
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
的第一次调用将在主线程的下一个循环中触发重绘,即使它与现有颜色匹配。我不能保证核心视图中每个现有的 属性 都是如此,因为我还没有检查它们。 setBackgroundColor
和 setText
绝对正确。
您对当前颜色的防御性检查可能会阻止不必要的重绘,但前提是您最终不会在主线程的这次迭代中改变任何视图。我想不出值得担心的情况。如果这是在 onCreate()
或 onViewCreated()
中,无论如何视图都还没有绘制。如果这是在点击监听器中,您的视图无论如何都会被重绘,因为您的按钮的视觉状态正在改变。
对影响视图大小的更改进行防御性检查可能是值得的,因为那样您可能会阻止重新布局。但可能只有在某些动画期间才会发生这种情况,否则节省的费用不会很明显。
让我们在片段中添加一些视图(例如 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
的第一次调用将在主线程的下一个循环中触发重绘,即使它与现有颜色匹配。我不能保证核心视图中每个现有的 属性 都是如此,因为我还没有检查它们。 setBackgroundColor
和 setText
绝对正确。
您对当前颜色的防御性检查可能会阻止不必要的重绘,但前提是您最终不会在主线程的这次迭代中改变任何视图。我想不出值得担心的情况。如果这是在 onCreate()
或 onViewCreated()
中,无论如何视图都还没有绘制。如果这是在点击监听器中,您的视图无论如何都会被重绘,因为您的按钮的视觉状态正在改变。
对影响视图大小的更改进行防御性检查可能是值得的,因为那样您可能会阻止重新布局。但可能只有在某些动画期间才会发生这种情况,否则节省的费用不会很明显。