自定义View原理篇(2)- layout过程

1. 简介

  • View的绘制过程分为三部分:measurelayoutdraw

measure用来测量View的宽和高。
layout用来计算View的位置。
draw用来绘制View。

  • 经过measure之后就进入了layout过程,measure过程可以查看这篇文章:自定义View原理篇(1)-measure过程

  • 本章主要对layout过程进行详细的分析。

  • 本文源码基于android 27

2. layout的始点

measure一样,layout也是始于ViewRootImplperformTraversals():

2.1 ViewRootImpl的performTraversals

    private void performTraversals() {
   
    
        //...
        
        //获得view宽高的测量规格,mWidth和mHeight表示窗口的宽高,lp.widthhe和lp.height表示DecorView根布局宽和高
        int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width);
        int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height);
        performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);//执行测量
        
        //...
        
        performLayout(lp, mWidth, mHeight);//执行布局
        
        //...
        
        performDraw();//执行绘制
        
        //...
    }

再来看看performLayout():

2.2 ViewRootImpl的performLayout

    private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth,
            int desiredWindowHeight) {
   
            
        //...
        
        //调用layout
        host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());

        //...
    }

这里的host就是DecorView,如果不知道DecorView,可以看看这篇文章:从setContentView揭开DecorView
layout()方法传入的0,0,host.getMeasuredWidth,host.getMeasuredHeight就是一个View的上下左右四个位置,可以看到,DecorView都是从左上角位置(0,0)开始进行布局的,其宽高则为测量宽高。

下面重点来分析Layout过程

3.layout过程分析

layout用来计算View的位置,即确定ViewLeftTopRightBottom这四个顶点的位置。如下图所示:
[外链图片转存失败(img-nd7ZrEmp-1568000248117)(http://upload-images.jianshu.io/upload_images/6163786-452eb2cc673d8ab0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

同样,layout过程根据View的类型也可以分为两种情况:

  1. 计算单一View位置时,只需计算其自身即可;
  2. 计算ViewGroup位置时,需要计算ViewGroup自身的位置以及其包含的子ViewViewGroup中的位置。

我们对这两种情况分别进行分析。

3.1 单一View的layout过程

单一Viewlayout过程是从Viewlayout()方法开始:

3.1.1 View的layout

 public void layout(int l, int t, int r, int b) {
   
        if ((mPrivateFlags3 & PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值