Android中的View刷新机制,通过invalidate()方法触发的绘制流程如下:
首先,当调用View的invalidate(),它会将需要重绘的区域通知其父ViewGroup,并调用invalidateChild()方法。在软件绘制过程中,ViewRootImpl会接收这个请求,开始计算需要更新的区域,并通过scheduleTraversals()安排后续的绘制任务。
ViewRootImpl的scheduleTraversals()会通过Handler开启同步屏障,然后执行mTraversalRunnable中的回调,这个回调负责记录绘制时间,并调用performTraversals()开始绘制过程。这个过程主要包括performMeasure()、performLayout()和performDraw()三个步骤。
在performMeasure()中,View会调用onMeasure()进行尺寸计算;performLayout()涉及onLayout(),用于布局调整;而performDraw()则执行onDraw(),绘制UI。默认情况下,只有onDraw()会在invalidate()后执行,因为mLayoutRequested默认为false。若需要执行onMeasure()和onLayout(),则需通过requestLayout()手动设置mLayoutRequested为true。
总结来说,invalidate()的流程是:从子View向根布局传递刷新任务,由根布局驱动整个View Tree进行更新。在性能优化上,invalidate()仅触发onDraw(),避免了不必要的测量和布局计算。
温馨提示:答案为网友推荐,仅供参考