View的布局(layout)过程

原创 2013年12月05日 17:30:39

1、View的布局(layout)过程分析

首先ViewRoot类的performTraversals()函数中调用host.layout(),host是一个View对象,layout()方法和measure()方法一样,是final类型,不能被重载。

下面是View中的layout方法代码:

    public final void layout(int l, int t, int r, int b) {
        boolean changed = setFrame(l, t, r, b);
        if (changed || (mPrivateFlags & LAYOUT_REQUIRED) == LAYOUT_REQUIRED) {
            if (ViewDebug.TRACE_HIERARCHY) {
                ViewDebug.trace(this, ViewDebug.HierarchyTraceType.ON_LAYOUT);
            }

            onLayout(changed, l, t, r, b);
            mPrivateFlags &= ~LAYOUT_REQUIRED;
        }
        mPrivateFlags &= ~FORCE_LAYOUT;
    }

首先调用setFrame()给当前视图设置指定的位置,接着调用onLayout(),一般host是一个ViewGroup的实例,ViewGroup的实例都重载了onLayout()方法,onLayout()方法中又调用了child.layout()方法,如果子视图还是一个ViewGroup实例,接着回调 ,直到调用常规View对象的layout()方法完成布局。

setFrame()方法中将布局参数保存到内部变量,在保存之前,会判断和旧的值是否相同,如果不同,先调用invalidate(),对老的区域进行重绘,重新赋值后,再调用invalidate()方法对新的区域进行重绘。

View中的onLayout()默认什么都不做,所以父视图(ViewGroup的实例)必须重载onLayout(),完成对子视图位置的分配。

最后清除LAYOUT_REQUIRED标志,因为layout的操作已经完成了。

2、LinearLayout中的onLayout()过程

(1)计算视图可以用空间

(2)根据Gravity属性计算出left、top、right、bottom值

(3)接着调用setChildFrame(),setChildFrame()中又调用了child中的layout()给子视图设置好了布局参数

(4)View类中的onLayout()默认什么都不做,自定义View可以复写onLayout()函数




版权声明:本文为博主原创文章,未经博主允许不得转载。

源码解析Android中View的layout布局过程

Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算、布局、绘图的总体机制可参见博文 《 Android中View的布局及绘图机制...

View 的 layout 布局和 draw 绘制过程

上篇文章View 的测量分析了 View 的工作原理中最复杂的测量过程,接着测量过程的是布局和绘制的过程,这里两个过程相对比较简单,所以放到一篇文章中来写View 的测量过程中,确定了 View 的测...
  • CoderR
  • CoderR
  • 2017年07月04日 15:53
  • 133

Android View深入学习(二),View的布局(Layout)过程

View布局最开始是从DecorView开始的,在ViewRootImpl中的performTraversals方法中,调用了 performLayout(lp, desiredWindowWidth...

Android View 布局流程(Layout)完全解析

前言上一篇文章,笔者详细讲述了View三大工作流程的第一个,Measure流程,如果对测量流程还不熟悉的读者可以参考一下上一篇文章。测量流程主要是对View树进行测量,获取每一个View的测量宽高,那...

深入了解View(二)—— layout布局流程分析

layout过程简介measure过程结束后,视图的大小就已经测量好了,接下来就是layout的过程了。正如其名字所描述的一样,这个方法是用于给视图进行布局的,也就是确定视图的位置。ViewRoot的...

Android自定义View之布局(layout)缩放

需求:手指滑动布局放大缩小移动,其子控件也跟着放大缩小。 系统自带有放大缩小的控件:ZoomControls.控制一张图片的放大缩小很简单。但这不满足我们的需求。今天我们来完成对布局的放大缩小还有移...

View在屏幕上显示出来要先经过measure(计算)和layout(布局)android

View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1、什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用...
  • laukaka
  • laukaka
  • 2012年06月11日 14:37
  • 1760

Android View - 布局Layout

Layout起布局作用,确定View的位置。当ViewGroup确定位置后,会遍历子View并调用其layout方法确定子View的位置。View的onLayout方法View的onLayout方法是...

Android View 布局流程(Layout)完全解析

前言 上一篇文章,笔者详细讲述了View三大工作流程的第一个,Measure流程,如果对测量流程还不熟悉的读者可以参考一下上一篇文章。测量流程主要是对View树进行测量,获取每一个View的测量...

layout_marginBottom的使用(将VIEW放置在布局底部)

1.LinearLayout中,将某一组件或布局放置于底部
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:View的布局(layout)过程
举报原因:
原因补充:

(最多只允许输入30个字)