zoukankan      html  css  js  c++  java
  • 自定义view布局过程详解

    布局过程,就是程序在运行时利用布局文件的代码来计算出实际尺寸的过程。

    布局分为两个阶段:测量阶段和布局阶段。

    测量阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 measure() 方法,测量他们的尺寸并计算它们的位置; 

    布局阶段:从上到下递归地调用每个 View 或者 ViewGroup 的 layout() 方法,把测得的它们的尺寸和位置赋值给它们;

    View或ViewGroup的布局过程

    1. 测量阶段,measure() 方法被父 View 调用,在 measure() 中做一些准备和优化工作后,调用 onMeasure() 来进行实际的自我测量。 onMeasure() 做的事,View 和 ViewGroup 不一样:

      1. ViewView 在 onMeasure() 中会计算出自己的尺寸然后保存,保存使用setMeasuredDimension()方法;
      2. ViewGroupViewGroup 在 onMeasure() 中会调用所有子 View 的 measure() 让它们进行自我测量,并根据子 View 计算出的期望尺寸来计算出它们的实际尺寸和位置然后保存。同时,它也会根据子 View 的尺寸和位置来计算出自己的尺寸然后保存;
    2. 布局阶段,layout() 方法被父 View 调用,在 layout() 中它会保存父 View 传进来的自己的位置和尺寸,并且调用 onLayout() 来进行实际的内部布局。onLayout() 做的事, View 和 ViewGroup 也不一样:

      1. View:由于没有子 View,所以 View 的 onLayout() 什么也不做。
      2. ViewGroupViewGroup 在 onLayout() 中会调用自己的所有子 View 的 layout() 方法,把它们的尺寸和位置传给它们,让它们完成自我的内部布局。

    重写 onMeasure() 来修改已有的 View 的尺寸具体做法:

    1. 重写 onMeasure() 方法,并在里面调用 super.onMeasure(),触发原有的自我测量;
    2. 在 super.onMeasure() 的下面用 getMeasuredWidth() 和 getMeasuredHeight() 来获取到之前的测量结果,并使用自己的算法,根据测量结果计算出新的结果;
    3. 调用 setMeasuredDimension() 来保存新的结果。

    父View的尺寸限制:

    1. 开发者的要求(布局文件中 layout_ 打头的属性)经过父 View 处理计算后的更精确的要求;
    2. 限制的分类: 
      1. UNSPECIFIED:不限制
      2. AT_MOST:限制上限
      3. EXACTLY:限制固定值

    重新自定义尺寸的方式:

      1. 重新 onMeasure(),并计算出 View 的尺寸;
      2. 使用 resolveSize() 来让子 View 的计算结果符合父 View 的限制(当然,如果你想用自己的方式来满足父 View 的限制也行)。
  • 相关阅读:
    C#
    Excel 中大量图片如何快速导出? 转载自:http://www.zhihu.com/question/20800948
    IE的F12开发人员工具不显示 转载自:http://blog.csdn.net/longyulu/article/details/8749705
    firefox ie 比较 relative path
    fiddler save files
    selenium3加载浏览器
    Linux安装PHP
    客户端级别的渲染分析工具 dynaTrace
    前端性能分析:分析百度和sogou
    Linux vi的基本操作
  • 原文地址:https://www.cnblogs.com/krislight1105/p/10045082.html
Copyright © 2011-2022 走看看