Android 基本布局总结

FrameLayout

FrameLayout是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。

我的理解是FrageLayout固定从屏幕的左上角开始填充图片,文字等。看看示例,原来可以利用android:layout_gravity来设置位置的

在FrameLayout布局里面android:layout_margin的各种属性必须依赖于android:layout_gravity,也就是说,要想margin生效,必须设定view的layout_gravity属性。单独设置marginLeft等属性是无效的.

LinearLayout

LinearLayout的android:layout_gravity属性与android:orientation密切相关

当 android:orientation="vertical" 时, 只有水平方向的设置才起作用,垂直方向的设置不起作用。 即:left,right,center_horizontal 是生效的。 当 android:orientation="horizontal" 时, 只有垂直方向的设置才起作用,水平方向的设置不起作用。 即:top,bottom,center_vertical 是生效的。

LinearLayout布局中Layout_weight属性的作用:它是用来分配属于空间的一个属性,默认为0


Android 基本布局总结_第1张图片

按照上面的理解,系统先给3个TextView分配他们的宽度值wrap_content(宽度足以包含他们的内容1,2,3即可),然后会把剩下来的屏幕空间按照1:2:3的比列分配给3个textview,所以就出现了上面的图像。

而当layout_width=“fill_parent”时,如果分别给三个TextView设置他们的Layout_weight为1、2、2的话,就会出现下面的效果:


你会发现1的权重小,反而分的多了,这是为什么呢???网上很多人说是当layout_width=“fill_parent”时,weighth值越小权重越大,优先级越高,就好像在背口诀

一样,其实他们并没有真正理解这个问题,真正的原因是Layout_width="fill_parent"的原因造成的。依照上面理解我们来分析:

系统先给3个textview分配他们所要的宽度fill_parent,也就是说每一都是填满他的父控件,这里就死屏幕的宽度

那么这时候的剩余空间=1个parent_width-3个parent_width=-2个parent_width (parent_width指的是屏幕宽度 )

那么第一个TextView的实际所占宽度应该=fill_parent的宽度,即parent_width + 他所占剩余空间的权重比列1/5 * 剩余空间大小(-2 parent_width)=3/5parent_width

同理第二个TextView的实际所占宽度=parent_width + 2/5*(-2parent_width)=1/5parent_width;

第三个TextView的实际所占宽度=parent_width + 2/5*(-2parent_width)=1/5parent_width;所以就是3:1:1的比列显示了。

这样你也就会明白为什么当你把三个Layout_weight设置为1、2、3的话,会出现下面的效果了:


第三个直接不显示了,为什么呢?一起来按上面方法算一下吧:

系统先给3个textview分配他们所要的宽度fill_parent,也就是说每一都是填满他的父控件,这里就死屏幕的宽度

那么这时候的剩余空间=1个parent_width-3个parent_width=-2个parent_width (parent_width指的是屏幕宽度 )

那么第一个TextView的实际所占宽度应该=fill_parent的宽度,即parent_width + 他所占剩余空间的权重比列1/6 * 剩余空间大小(-2 parent_width)=2/3parent_width

同理第二个TextView的实际所占宽度=parent_width + 2/6*(-2parent_width)=1/3parent_width;

第三个TextView的实际所占宽度=parent_width + 3/6*(-2parent_width)=0parent_width;所以就是2:1:0的比列显示了。第三个就直接没有空间了。

按比例显示LinearLayout内各个子控件,需设置android:layout_width="0dp",如果为竖直方向的设置android:layout_height="0dp"。在这种情况下某子个控件占用LinearLayout的比例为:本控件weight值 / LinearLayout内所有控件的weight值的和。

LinearLayout的layout_weight属性会要求该layout以及layout下面的控件都measure两次,那么如果这个属性嵌套的话 会导致measure次数以指数倍增

RelativeLayout

layout_orientation这个属性在relativelayout中不成立

在RelativeLayout中虽然没有android:layout_gravity这个属性,但是是有layout_alignParentBottom这种属性,是贴紧父亲布局的下边缘。

RelativeLayout的toLeftof和alignleft的区别

button2 alignleft button1:button2的左边缘和button1的左边缘对齐

Android 基本布局总结_第2张图片

button2 layout_toLeftOf="@id/button1":button2的右边缘和button1的左边缘对齐

Android 基本布局总结_第3张图片

Layout_Margin详解

所有布局的控件的layout_margin设置,都跟他本身的layout_gravity 或者linearlayout中处于横向或者竖向的位置或者relativelayout他的相对位置有关,如果没有设置,或者不符合的话,设置margin是没有用的

分别来看,在FrameLayout中一切margin指的都是跟父布局的关系,那么marigin跟layout_gravity有关,gravity设置为bottom,就只有layout_marginBottom起作用,layout_marginTop不起作用,但因为默认是左边,所以layout_marginLeft也起作用。什么都不设置的情况下,layout_marginLeft和layout_marginTop生效。

LinearLayout中,上下方向或者左右方向的第一个子控件,设置的layout_marginTop或者layout_marginLeft是跟父布局有关的。但是在上下方向的Linearlayout中设置layout_marginLeft,不管第几个子控件,都是指跟父控件的margin。在上下方向的Linearlayout中设置layout_marginTop,在第一个控件中指跟父布局的距离,在第二个控件中指跟第一个控件的距离

在RelativeLayout中(以下以left为例),必须要先设置alignParentLeft或alignleft或toleftof,margin才会生效。alignParentLeft会覆盖alignleft和toleftof。

toLeftof设置之后的位置是包括给定控件的margin的,比如 button2 toleftof button1,button1有layout_margin = 50dp, 那么button2会在button1 左边50dp的位置

在alignleft下,计算margin从左边缘起,只有layout_marginLeft可以起作用,layout_marginright不起作用。

你可能感兴趣的:(Android 基本布局总结)