赞
踩
此篇博客转载自linyyy,链接:https://blog.csdn.net/u012803067/article/details/56484986 复写一遍用作学习。
在Android中,有五种常用的布局方式,分别是:FrameLayout(框架布局)、LinearLayout(线性布局)、AbsoluteLayout(绝对布局)、RelativeLayout(相对布局)和TableLayout(表格布局)。
Android五种布局都具备上述几个基础属性
作为最基本的Layout,只具备上述的基础属性
orientation(方向):设置Layout内控件的排列方式,有两个定值:vertical(垂直排列-默认值);horizontal(水平排列)
layout_weight(权重):独有的比例分配属性。在同一个LinearLayout内的控件都会默认有这个值,且默认值是0 。计算公式是:
控件最终宽度/高度 = 控件设置宽度+layout_weight比例*layout剩余宽度/高度
可以看到,layout_weight实质上是将layout剩余宽度/高度根据比例分配。控件设置宽度,也就是layout和控件的layout_width/layout_height共同决定的控件初始拥有的宽度/高度。layout剩余宽度/高度的计算看具体例子。
例1:LinearLayout的layout_width=“match_parent”,orientation=“horizontal”,占满了屏幕的宽度。里面有三个TextView,layout_width=“wrap_content”,那么三个子组件会按照默认TextView的宽度依次排列,剩余的位置也就是"layout剩余宽度",由于没有设置layout_weight的值,三个TextView默认都为0,所以剩余宽度没有被占用。如下图所示。
例2:接例1,为三个TextView设置layout_weight分别为1、2、3,那么自然三个组件也就按照1:2:3的比例占满了屏幕宽度。其中第一个TextView的比例是1/1+2+3=1/6。
例3:接上例,当三个组件的layout_weight="match_parent"时,也就是三个组件都想占满整个父布局的宽度,这个时候layout剩余宽度的计算就比较有意思了。以screen_width代表屏幕宽度,父LinearLayout占满一个screen_width
此时的layout剩余宽度 = 1 screen_width - 3 screen_width = -2 screen_width
没错,这个剩余宽度可以是负值。所以在计算组件最终宽度的时候,是这么算的:控件最终宽度 = 1 screen_width(因为是match_parent)+ 比例 * -2 screen_width
照例2的layout_weight,当layout_weight都为"match_parent"时,第一个TextView宽度 = 1 + 1/6 * (-2) = 2/3;第二个TextView宽度 = 1 + 2/6 * (-2) = 1/3;第一个TextView宽度 = 1 + 3/6 * (-2) = 0 。效果如下图所示,第三个TextView不见了。
RelativeLayout的额外属性较多:
属性值 | 效果 |
---|---|
layout_alignParentBottom | 当前控件底端与父控件的底端对齐 |
layout_alignParentLeft | 当前控件左端与父控件的左端对齐 |
layout_alignParentRight | 当前控件右端与父控件的右端对齐 |
layout_alignParentTop | 当前控件上端与父控件的上端对齐 |
layout_centerHorizontal | 当前控件位于父控件的横向中间位置(水平方向上的中间) |
layout_centerVertical | 当前控件位于父控件的纵向中间位置(平面上的正中间) |
layout_centerInParent | 当前控件位于父控件的纵横向中间位置(垂直方向上的中间) |
以上所有属性的取值皆为boolean属性。例:layout_alighParentBottom = “true”
属性值 | 效果 |
---|---|
layout_above | 使当前控件位于给定id控件的上方 |
layout_below | 使当前控件位于给出id控件的下方 |
layout_toLeftOf | 使当前控件位于给出id控件的左侧 |
layout_toRightOf | 使当前控件位于给出id控件的右侧 |
layout_alignBottom | 使当前控件与给定id控件的底部重合 |
layout_alignTop | 使当前控件与给定id控件的顶部重合 |
layout_alignLeft | 使当前控件与给定id控件的左侧重合 |
layout_alignRight | 使当前控件与给定id控件的右侧重合 |
layout_alignBaseline | 使当前控件的BaseLine与给定id控件的BaseLine重合 |
作用:通过设置selector.xml可使得控件在不同操作下(默认、点击、焦点等)显示不同的样式。
创建方式
注意:
设置 background属性的时候,我们的selector状态选择器存放在res - drawable 下;
设置TextColor属性的时候,我们的selector状态选择器存放在res - color 下。
XML属性 | 说明 |
---|---|
android:drawable | 放一个drawable资源 |
android:state_pressed | 按下状态,入一个按钮触摸或者点击 |
android:state_focused | 取得焦点状态,比如用户选择了一个文本框 |
android:state_hovered | 光标悬停状态(API Level 11及以上才支持) |
android:state_selected | 选中状态 |
android:state_enabled | 能够被触摸或者点击事件 |
android:state_checked | 设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选 |
android:state_checkable | 类似state_enabled,只是state_enabled会影响触摸或点击事件,state_checkable影响勾选事件 |
上述所有属性的取值皆为boolean属性,说明部分一般是取值为true时的效果。当取值为false时,效果是反过来的。例如state_pressed为false时代表按钮松开时。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimary" android:state_pressed="true"/>
<item android:color="@color/colorAccent" />
</selector>
使用处:
<Button
android:textColor="@color/bg_btn_one" //此处引用
android:layout_width="match_parent"
android:layout_height="45dp"
android:text="样式一:点击改变字体颜色"
/>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/colorAccent" android:state_pressed="true"/>
<item android:drawable="@color/colorPrimary" />
</selector>
使用处:
<Button
android:background="@drawable/bg_btn_two"
android:layout_width="match_parent"
android:layout_height="45dp"
android:text="样式二:点击改变背景颜色"
/>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。