面试官:View.post() 为什么能够获取到 View 的宽高 ?-阿里云开发者社区
根据 ViewRootImpl 是否已经创建,View.post() 会执行不同的逻辑。如果 ViewRootImpl 已经创建,即 mAttachInfo 已经初始化,直接通过 Handler 发送消息来执行任务。如果 ViewRootImpl 未创建,即 View 尚未开始绘制,会将任务保存为 HandlerAction,暂存在队列 HandlerActionQueue 中,等到 View 开始绘制,执行 performTraversal() 方法时,在 dispatchAttachedToWindow() 方法中通过 Handler 分发 HandlerActionQueue 中暂存的任务。
除了通过 View.post()
获取视图宽高之外,还有两种比较推荐的方式。
第一种,onWindowFocusChanged()
。
第二种,OnGlobalLayoutListener
。
binding.dialog.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() {
binding.dialog.viewTreeObserver.re