• Android measure和layout的一点理解


    首先,推荐文章,http://blog.csdn.net/hqdoremi/article/details/9980481http://www.docin.com/p-571954086.html

    我理解measure的作用有2个:一个就是调用子view的measure函数,生成他们的高度和宽度,以便在自己的layout阶段参考;另一个是为父view提供关于自己的测量的width和height(这个宽度和高度往往和子view的测量高度和宽度有关),以便父view在layout阶段参考。

    onMeasure 中,一般是先调用measureChildren让子view先确定自己的大小,再分别调用getMeasuredWidth()获得测量出的大小,随后使用setMeasuredDimension函数设定自身的大小。measureChildren方法会传入widthMeasureSpec和heightMeasureSpec,表示当前view对子view的大小约束,子view根据这个限制和自身的约束(比如写在layout文件中的具体尺寸),就能确定具体的大小了。确定方法如下(借用一个图):

    layout的作用就是布局子view的大小位置,这里可以使用刚才测量出的width和height,也可以不使用(当然,系统自带的布局都是使用的,因为这是推荐的规范做法),这完全取决于你想实现的布局效果(比如我可以知道子view的确定位置,就可以直接调用子view的layout函数定位,根本不用什么测量值),所以measure产生的mMeasuredWidth和mMeasuredHeight仅仅是参考用的。

    把measure和layout分开,更方便重用系统控件。比如ListView不想使用滚动条,想把内容全部现实出来,就可以简单地重写一个onMeaure函数,继续使用默认的onLayout函数。代码如下:

    public class NoScrollListView extends ListView{
        public NoScrollListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
            int mExpandSpec = View.MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, mExpandSpec);
        }
    }

    这里的onMeaure,修改了父view对listview的高度说明,改为“最多达到最大整数值”,其实就意味着当父view布局这个listview时,分配的高度,是不受父view高度限制了(感觉listview之所以出现滚动条,是在onMeasure中根据父view的大小来判断的),所以listview会把内容全部加载到了父view上,没有了滚动条,当然,超过父view的地方看不见,需要配合scrollview使用。

  • 相关阅读:
    httpclient + TestNG 接口自动测试 第二章
    httpclient + TestNG 接口自动测试 第一章
    Kafka-manager启动命令
    多台服务器搭建Spark集群
    Scala学习 -- 基础语法
    Spark学习 -- RDD
    Spark 学习
    Angular constructor和OnInit的区别和适用场景
    TypeScript基础学习 —— 变量声明
    TypeScript基础学习 —— 基础类型
  • 原文地址:https://www.cnblogs.com/breezemist/p/3833118.html
Copyright © 2020-2023  润新知