3 回答
TA贡献1815条经验 获得超10个赞
invalidate()
invalidate()当您要计划重绘视图时,调用完成。这将导致onDraw最终(很快,但不是立即)被调用。自定义视图何时调用的一个示例是文本或背景颜色属性已更改。
视图将被重绘,但是大小不会改变。
requestLayout()
如果关于视图的某些更改会影响大小,则应致电requestLayout()。这将触发onMeasure并onLayout不仅是这个观点,但一路上扬父视图的线。
不能保证调用requestLayout()会导致onDraw(与接受的答案中的图相反),因此通常将其与结合使用invalidate()。
invalidate();
requestLayout();
例如,自定义标签的text属性发生更改时。标签会改变尺寸,因此需要重新测量和重新绘制。
forceLayout()
当requestLayout()在父视图组上调用时,不需要重新测量并重传其子视图。但是,如果在重新测量和重排中应包括一个孩子,则可以呼叫forceLayout()该孩子。forceLayout()仅在子代requestLayout()与其直接父代一起出现时才对子代起作用。forceLayout()本身调用不会起作用,因为它不会触发requestLayout()视图树。
阅读此问答以获取有关的详细说明forceLayout()。
TA贡献1853条经验 获得超9个赞
正如您在代码中所forceLayout()看到的那样,它仅将视图标记为“需要重新布局”,但是它既没有计划也没有触发该重新布局。重新布局将不会发生,直到将来某个时候由于其他原因布置视图的父级。
使用forceLayout()和时,还有一个更大的问题requestLayout():
假设您已经调用forceLayout()了一个视图。现在,当调用requestLayout()该视图的后代时,Android将递归调用requestLayout()该后代的祖先。问题是它将在您调用的视图处停止递归forceLayout()。因此,该requestLayout()调用将永远不会到达视图根,因此也不会调度布局遍历。视图层次结构的整个子树都在等待布局,并且调用requestLayout()该子树的任何视图都不会导致布局。仅requestLayout()在该子树之外调用任何视图都会破坏该咒语。
我会考虑的实现forceLayout()(以及它如何requestLayout()受到破坏,因此您永远不要在代码中使用该函数。
- 3 回答
- 0 关注
- 1466 浏览
添加回答
举报