DecorView的测量过程

DecorView的MeasureSpec的创建过程

在ViewRootImpl中的mearsureHierarchy方法中有一段代码展示了DecorView的MeasureSpec的创建过程:

       childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width);
       childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height);
       performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);

看一下gerRootMeasureSpec方法:

    /**
     * Figures out the measure spec for the root view in a window based on it‘s
     * layout params.
     *
     * @param windowSize
     *            The available width or height of the window
     *
     * @param rootDimension
     *            The layout params for one dimension (width or height) of the
     *            window.
     *
     * @return The measure spec to use to measure the root view.
     */
    private static int getRootMeasureSpec(int windowSize, int rootDimension) {
        int measureSpec;
        switch (rootDimension) {

        case ViewGroup.LayoutParams.MATCH_PARENT:
            // Window can‘t resize. Force root view to be windowSize.
            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY);
            break;
        case ViewGroup.LayoutParams.WRAP_CONTENT:
            // Window can resize. Set max size for root view.
            measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST);
            break;
        default:
            // Window wants to be an exact size. Force root view to be that size.
            measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY);
            break;
        }
        return measureSpec;
    }
时间: 2024-12-28 08:35:25

DecorView的测量过程的相关文章

View的测量过程

测量规格说明书 MeasureSpec DecorView的测量过程 LinearLayout的测量过程

View测量机制详解—从DecorView说起

绪 很多朋友都沉迷于自定义View, 而自定义View离不开measure.layout.draw三个步骤,在测量方面,很多朋友仅仅是知道怎么去测量一个控件,而对于为什么要这么做等等问题都搞的不是很清楚,今天这篇文章我们就从View树的最顶层DecorView开始分析测量到底是怎么一回事. 这篇文章要解决的问题有: onMeasure的两个参数从哪来. 最开始的参数是怎么计算出来的. 测量规格是根据什么得到的. 一切从DecorView说起 大家都知道在我们的应用窗口中最顶层的View是Deco

View绘制详解(三),扒一扒View的测量过程

所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都很简单.OK,废话不多说,今天我们就来看看View的测量.View的测量纷繁复杂,不过如果能够做到提纲挈领,其实也不难.那么今天,我们就来扒一扒View的测量.本文主要涉及如下知识点: 1.View的测量 2.在父容器中对View进行测量 3.LinearLayout测量举例 4.最根上容器测量 如

Window窗口布局 --- DecorView浅析

开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局,我们知道,页面都是依附在窗口之上的,而DecorView即是窗口最顶层的视图.Android frameworks中,与窗口视图处理相关的类,主要是Window及其实现类PhoneWindow public class PhoneWindow extends Window implements MenuBuilder.Callback { //... //

Android-->状态栏高度,导航栏高度,Window高度,DecorView高度,heightPixels

喔-这标题,吓我一跳; 请稍等-. 思绪整理中- Android中, 经常被这些高度绊脚. 完全进入懵逼的状态, 有木有? 请允许我,介绍清楚! 通常情况下, 宽度都是很友好的,但是高度就呵呵, 所以本文只介绍高度的计算. 1:DecorView的高度 DecorView的高度代表的是: 整个装饰窗口的高度, 这个高度包括:状态烂的高度和导航栏的高度.(状态栏和导航栏通常叫做装饰窗口, 而ActionBar不属于装饰窗口) 这个高度, 可以代表着整个玻璃屏幕的高度. 2.Window的RootV

Android DecorView浅析

摘要 一.DecorView为整个Window界面的最顶层View. 二.DecorView只有一个子元素为LinearLayout.代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域. 三.LinearLayout里有两个FrameLayout子元素. (20)为标题栏显示界面.只有一个TextView显示应用 (请发邮件到 [email protected]  获得最新翻强软件.) 一.DecorView为整个Window界面的最顶层View. 二.DecorView只有一个子

关于dialog引起的 java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView not attached to window manager 错误的分析

在跑Monkey测试的时候出现了一个比较特别的问题,先来看看Log: 1 // CRASH: com.meizu.media.painter (pid 12491) 2 3 // Short Msg: java.lang.IllegalArgumentException 4 5 // Long Msg: java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{2

Android -- DecorView

DecorView 开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局.页面都是依附在窗口之上的,而DecorView即是窗口最顶层的视图.Android frameworks中,与窗口视图处理相关的类,主要是Window及其实现类PhoneWindow public class PhoneWindow extends Window implements MenuBuilder.Callback { //.

decorview that was originally added here or java.lang.IllegalArgumentException: View not attached to window manager

使用Dialog的时候,没少出现下面这两个报错 12-11 17:47:49.776: E/WindowManager(11461): android.view.WindowLeaked: Activity TestActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{42204800 V.E..... R.....I. 0,0-640,164} that was originally