Android requestLayout和invalidate源码分析

      Android有两个刷新函数,requestLayout和invalidate,invalidate只会引起View Hierarchy的draw过程,requestLayout会引起measure和layout过程,如果在layout过程中发现View的布局确实发生了改变,就会调用invalidate函数来刷新View


先来看以下View.requestLayout源码

[java]  view plain copy print ?
  1. /** 
  2.  * Call this when something has changed which has invalidated the 
  3.  * layout of this view. This will schedule a layout pass of the view 
  4.  * tree. 
  5.  */  
  6. public void requestLayout() {  
  7.     mPrivateFlags |= PFLAG_FORCE_LAYOUT;  
  8.     mPrivateFlags |= PFLAG_INVALIDATED;  
  9.   
  10.     if (mParent != null && !mParent.isLayoutRequested()) {  
  11.         // 先上传递,最总到达顶层View即RootViewImpl  
  12.         mParent.requestLayout();  
  13.     }  
  14. }  


    查看下ViewRootImpl.requestLayout源码

[java]  view plain copy print ?
  1. public void requestLayout() {  
  2.     // 检测是否在UI线程  
  3.     checkThread();  
  4.     mLayoutRequested = true;  
  5.     // 重点  
  6.     scheduleTraversals();  
  7. }  

[java]  view plain copy print ?
  1. public void scheduleTraversals() {  
  2.     if (!mTraversalScheduled) {  
  3.         mTraversalScheduled = true;  
  4.   
  5.         //noinspection ConstantConditions  
  6.         if (ViewDebug.DEBUG_LATENCY && mLastTraversalFinishedTimeNanos != 0) {  
  7.             final long now = System.nanoTime();  
  8.             Log.d(TAG, "Latency: Scheduled traversal, it has been "  
  9.                     + ((now - mLastTraversalFinishedTimeNanos) * 0.000001f)  
  10.                     + "ms since the last traversal finished.");  
  11.         }  
  12.         // 发出一个遍历的Handler信息  
  13.         sendEmptyMessage(DO_TRAVERSAL);  
  14.     }  
  15. }  


RootViewImpl.handleMessage方法源码:

[java]  view plain copy print ?
  1. @Override  
  2. public void handleMessage(Message msg) {  
  3.     switch (msg.what) {  
  4.     ......  
  5.     case DO_TRAVERSAL:  
  6.         if (mProfile) {  
  7.             Debug.startMethodTracing("ViewAncestor");  
  8.         }  
  9.   
  10.         final long traversalStartTime;  
  11.         if (ViewDebug.DEBUG_LATENCY) {  
  12.             traversalStartTime = System.nanoTime();  
  13.             mLastDrawDurationNanos = 0;  
  14.         }  
  15.         // 接收到消息之后,开始执行遍历,具体measure,layout,draw操作  
  16.         performTraversals();  
  17.   
  18.         if (ViewDebug.DEBUG_LATENCY) {  
  19.             long now = System.nanoTime();  
  20.             Log.d(TAG, "Latency: Spent "  
  21.                     + ((now - traversalStartTime) * 0.000001f)  
  22.                     + "ms in performTraversals(), with "  
  23.                     + (mLastDrawDurationNanos * 0.000001f)  
  24.                     + "ms of that time in draw()");  
  25.             mLastTraversalFinishedTimeNanos = now;  
  26.         }  
  27.   
  28.         if (mProfile) {  
  29.             Debug.stopMethodTracing();  
  30.             mProfile = false;  
  31.         }  
  32.         break;  
  33. ...  
  34.     }  
  35. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值