Android measure 简单理解

来源:互联网 发布:淘宝里的天猫店 编辑:程序博客网 时间:2024/06/07 06:08
一、如何设置视图的大小?
1. 如何设置视图大小:layout_width与layout_heigh

2. layout_width与layout_heigh的值
1) 填满:fill_parent、math_content
2) 包裹:wrap_content
3) 具体值:99dip

3. 如果不指定Width与Height会出现以下异常
java.lang.RuntimeException: Binary XML file line #46: You must supply a layout_width attribute.


二、布局参数最终加载为代码
1. XML 或者代码设置layout_width和layout_height属性,XML通过inflate转换成代码。
width 与 height 映射到 LayoutParams?

         public LayoutParams(Context c, AttributeSet attrs) {
            TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout);
            setBaseAttributes(a,
                    R.styleable.ViewGroup_Layout_layout_width,
                    R.styleable.ViewGroup_Layout_layout_height);
            a.recycle();
        }
如果是代码直接View.setLayoutParams(new LayoutParams(x, y));


2. 了解ViewGroup.LayoutParams 派生类,可以知道(Android 布局控件设计师)都提供了哪些参数
有两种添加LayoutParams的方法: Java Code、layout XML


三、简单理解
视图的大小由谁来决定?
    由父视图、子视图、界面开发人员共同决定。

为什么布局需要父视图与子视图共同决定? 为什么不直接设置宽和高?
    先来看看如果界面开发人员直接可以指定宽高效果如何。例如:Html就是可以指定宽高的,界面开发人员是具有整个页面的控制权,这样在有些情况下会造成一个过大把另外一个挤出去。
再来看看Android是如何做的?
    Android是拆分开的,这样做保证了最末端的(界面开发)影响其他层级的布局,需要按照(控件开发)的规则来。
    需要通过measureChilde(view, width, height), 或者childView.measure();
    父视图限制子视图显示区域,子视图控制自身大小。


* 问题1 :
如果视图还未添加到ViewGroup中,还想获取其宽高,需要手动调用View.measure()方法?
   可以传入三种模式或者具体值
   child.measure(MeasureSpec.EXACTLY | itemWidth, MeasureSpec.UNSPECIFIED);
   MeasureSpec.EXACTLY | itemWidth?

* 问题2:
如何在视图已经显示之后,动态修改宽高?

* 问题3:
? measure执行多次?
例子总只写了一个view,在onMeasure中添加log获知此方法执行2次? 在ADT 20.3中同样的代码onMeasure执行4次?不是应该只执行一次吗?
父view要求子view onalyout,但是之后又调整大小,所以子view会再次执行onlayout


* 问题4: 解释完为什么视图大小由父子视图决定后
layout_前缀的含义 - ***layout的意思解释,是这对其父空间,非子控件
layout的意思解释,是这对其父空间,非子控件
为什么设置与记录宽高的对象LayoutParams是在ViewGroup中定义的,难道View就不需要设置宽高吗?


0 0
原创粉丝点击