Android基础:Android布局
Android布局
- 布局
- Android七大基本布局
- 通用属性
- 线性布局LinearLayout
- 常见属性
- 布局方向
- 布局相对位置
- 布局权重设置
- 分割线(不常用)
- 相对布局RelativeLayout
- 常见属性
- 基本属性
- 根据父容器定位
- 根据兄弟组件定位
- 表格布局TableLayout
- 常见属性
- 帧布局FrameLayout
- 常见属性
- 网格布局GridLayout
- 常见属性
- 约束布局ConstraintLayout(重要)
- 基线对齐
- 角度对齐
- 百分比偏移
- 控件内边距、外边距
- GONE Margin
布局
安卓布局其实和HTML里的盒子模型类型,也存在padding,margin等。
Android七大基本布局
- 线性布局:LinearLayout
- 相对布局:RelativeLayout
- 表格布局:TableLayout
- 层(帧)布局:FrameLayout
- 绝对布局:AbsoluteLayout
- 网格布局:GridLayout
- 约束布局:ConstraintLayout
布局用的最多的是线性布局和相对布局。其中表格布局是线性布局的子类,而因为适配的原因,绝对布局几乎是很少见的。
通用属性
属性 | 描述 |
---|---|
layout_width | 宽 |
layout_height | 高 |
padding | 内边距 |
margin | 外边距 |
visibility |
visible:显示; invisible:不现实但是占用空间; gone:不显示也不占用空间 |
focusable | 是否可以获取焦点 |
enabled | 是否启用该控件 |
background | 背景色,16进制值 |
id | 唯一标识符(id必须唯一),用于定位该控件 |
其中padding和margin可以分别控制单独上下左右,比如paddingTop,paddingLeft, marginRight等。
线性布局LinearLayout
线性布局是一种非常实用的布局。线性布局具有水平方向与垂直方向的两种布局方式。是通过属性“android:orientation”控制布局方向(默认水平方向)
常见属性
布局方向
属性 | 描述 |
---|---|
orientation(重要) |
设置线性布局方向。 horizontal:水平方向 vertical:竖直方向 |
布局相对位置
属性 | 描述 |
---|---|
gravity | 控制该组件所包含的子元素的对齐方式,可以多个组合,如(left|bottom)。写在父组件里,控制子组件。 |
layout_gravity | 控制子组件在父组件中的位置。写在子组件上,控制自己在父组件中的位置。 |
gravity:
layout_gravity:
如果两个都设置,那么按后者效果来。
布局权重设置
属性 | 描述 |
---|---|
layout_weight | 设置了布局方向,以 剩余空间 为基准,该控件所占权重。 |
weightSum | 定义了weight 总和的最大值(单独设置没效果)。 |
这边最关键的词是剩余空间,他指的是在布局方向上,除去所有组件自身所占空间和margin所占空间之后,剩余的值。以水平方向布局为例:水平方向总宽度为700dp,并且有组件A和B,组件A设置layout_width=200dp;layout_margin=50dp; 组件B设置layout_width=100dp;那么水平方向剩余空间为:700-50-200-50-100=300dp。该属性的主要作用可以用来做适配 。
这时,我们将剩余空间(300dp)分为3份(weightSum=3),组件A占2份(layout_weight=2),组件B占1份(layout_weight=1)。
此时,我们不难发现,该水平方向空间占比依次为:marginLeft:50dp ---- 组件A:400dp(200dp+200dp) ---- marginRight:50dp ---- 组件B:200dp(100dp+100dp)。
注意:weightSum是可以不设置的。如果weightSum没有设置,Android会根据子组件所设置的layout_weight计算出weightSum的值。
分割线(不常用)
属性 | 描述 |
---|---|
divider | 为LinearLayout设置分割线所使用的的图片。 |
showDividers | 设置分割线所在位置,值为:none, middle, begining, end。 |
dividerPadding | 设置分割线的Padding。 |
相对布局RelativeLayout
如果当需要嵌套多层的 LinearLayout,界面就会变得尤为复杂,复杂的界面势必会带来UI Render的效率(渲染速度)降低等问题,而且如果在listview或者GridView上的 item,效率会更低,另外太多层LinearLayout嵌套会占用更多的系统资源,还有可能引发stackoverflow等问题,这时,RelativeLayout就能很好的解决,它仅仅只需要一层就可以完成.而在现实业务需求中,我们常用的方式是:RelativeLayout + LinearLayout的weight属性搭配使用。
常见属性
基本属性
属性 | 描述 |
---|---|
gravity | 控制该组件所包含的子元素的对齐方式,可以多个组合,如(left |
ignoreGravity | 设置该组件是否受gravity影响,如果设置为true,则不受gravity影响。 |
根据父容器定位
属性 | 描述 |
---|---|
layout_alignParentLeft | 控制该组件左对齐。 |
layout_alignParentRight | 控制该组件右对齐。 |
layout_alignParentTop | 控制该组件顶部对齐。 |
layout_alignParentBottom | 控制该组件底部对齐。 |
属性 | 描述 |
---|---|
layout_centerHorizontal | 控制该组件水平居中。 |
layout_centerVertical | 控制该组件垂直居中。 |
layout_centerInParent | 控制该组件处于中间位置。 |
根据兄弟组件定位
属性 | 描述 |
---|---|
layout_toLeftOf | 控制该组件在兄弟组件的左侧。 |
layout_toRightOf | 控制该组件在兄弟组件的右侧。 |
layout_above | 控制该组件在兄弟组件的上方。 |
layout_below | 控制该组件在兄弟组件的下方。 |
layout_alignTop | 控制该组件在兄弟组件的上边界。 |
layout_alignBottom | 控制该组件在兄弟组件的下边界。 |
layout_alignLeft | 控制该组件在兄弟组件的左边界。 |
layout_alignRight | 控制该组件在兄弟组件的右边界。 |
注意:这里是通过ID去获取兄弟组件的。
下面四个组件主要是设置对齐,当比如某个组件比较长或者比较短,设置对齐后可以使得长度一样长。
表格布局TableLayout
在TableLayout中,一个TableRow则为一行。后面我们更多用GridLayout代替TableLayout
常见属性
属性 | 描述 |
---|---|
collapseColumns | 设置需要被隐藏的列的序号 |
shrinkColumns | 设置允许被收缩的列的列序号 |
layout_column | 设置跳过n个 |
layout_span | 设置合并n个单元格 |
上述三个属性的序列号都是从0开始算的,比如collapseColumns= “1”,对应的是第二列!当然也可以设置多个,如果需要设置多个,可以用逗号分隔(collapseColumns=“1,2”),如果设置为collapseColumns="*",则所有列都生效
<TableLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"tools:context=".MainActivity"><TableRow android:background="@color/cardview_dark_background"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="属性"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="描述"/></TableRow><TableRow ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="collapseColumns"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="设置需要被隐藏的列的序号"/></TableRow><TableRow ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="shrinkColumns"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="设置允许被收缩的列的列序号"/></TableRow><TableRow ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="stretchColumns"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16dp"android:textColor="@color/black"android:text="设置运行被拉伸的列的列序号"/></TableRow></TableLayout>
帧布局FrameLayout
FrameLayout(帧布局)可以说是七大布局中最为简单的一个布局,这个布局直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式却没有任何的定位方式,所以它应用的场景并不多;帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个组件!后续添加的控件会覆盖前一个!
常见属性
属性 | 描述 |
---|---|
foreground | 设置改帧布局容器的前景图像 |
foregroundGravity | 设置前景图像显示的位置 |
帧布局用的不是很多,在这里不详细介绍了,感兴趣的可以看:帧布局。
网格布局GridLayout
网格布局是Android 4.0以后引入的一个新的布局,可以很方便的设置N行N列。
常见属性
属性 | 描述 |
---|---|
orientation |
设置线性布局方向。 horizontal:水平方向 vertical:竖直方向 |
layout_gravity | 控制子组件在父组件中的位置。写在子组件上,控制自己在父组件中的位置。 |
rowCount | 设置网格布局行数 |
columnCount | 设置网格布局列数 |
layout_row | 设置组件位于第N行 |
layout_column | 设置组件位于第N列 |
rowSpan | 设置组件纵向横跨N行 |
columnSpan | 设置组件横向向横跨N行 |
网格布局用的不是很多,在这里不详细介绍了,感兴趣的可以看:网格布局。
约束布局ConstraintLayout(重要)
约束布局是一个比较好用的布局,他是一个ViewGroup,他可以直接Design上直接拖动设置,也可以写代码去实现。约束布局需要X和Y轴都至少设置一个约束才能控制布局。他的出现主要是为了解决布局嵌套过多的问题。
基线对齐
// 开始于某个指定组件的开始app:layout_constraintStart_toStartOf// 开始于某个指定组件的结束app:layout_constraintStart_toEndOf// 结束于某个指定组件的开始app:layout_constraintEnd_toStartOf// 结束于某个指定组件的结束app:layout_constraintEnd_toEndOfapp:layout_constraintTop_toTopOfapp:layout_constraintTop_toBottomOfapp:layout_constraintBottom_toTopOfapp:layout_constraintBottom_toBottomOf
这些是约束布局的重要基线对齐约束,他是以你指定的组件为基础去实现约束,这里因为考虑各国的使用习惯,就用start,end代替了left和right。
角度对齐
app:layout_constraintCircle="" 目标控件id
app:layout_constraintCircleAngle="" 对于目标的角度(0-360)
app:layout_constraintCircleRadius="" 到目标中心的距离
百分比偏移
app:layout_constraintHorizontal_bias="" 水平偏移 取值范围是0-1的小数
app:layout_constraintVertical_bias="" 垂直偏移 取值范围是0-1的小数
控件A在父布局水平方向偏移0.24指的是24%
控件内边距、外边距
<!-- 外边距 -->
android:layout_margin="0dp"
android:layout_marginStart="0dp"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp"
android:layout_marginEnd="0dp"
android:layout_marginRight="0dp"
android:layout_marginBottom="0dp"<!-- 内边距 -->
android:padding="0dp"
android:paddingStart="0dp"
android:paddingLeft="0dp"
android:paddingTop="0dp"
android:paddingEnd="0dp"
android:paddingRight="0dp"
android:paddingBottom="0dp"
GONE Margin
app:layout_goneMarginBottom="0dp"
app:layout_goneMarginEnd="0dp"
app:layout_goneMarginLeft="0dp"
app:layout_goneMarginRight="0dp"
app:layout_goneMarginStart="0dp"
app:layout_goneMarginTop="0dp"
该属性的使用场景主要是:如果A控件的布局依赖B控件,但是B组件隐藏了,这时候原本的margin会失效,这时候就要用到goneMargin。但是,当目标控件是显示的时候GONE Margin不会生效。
目前ConstraintLayout使用的不多,由于开发任务相对紧张,暂时更新到这,具体更详细的,请参照:史上最全ConstraintLayout使用详解
Android基础:Android布局相关推荐
- Android基础——Android系统概览
1. Android系统架构 android大致可以分为四层架构:Linux内核层,系统运行库层.应用框架层和应用层 Linux内核层 android系统是基于Linux内核,这一层为android设 ...
- [Android 基础] -- Android 属性系统简介
一.简介 在 android 系统中,为同一管理系统的属性,设计了一个统一的属性系统.每个属性都有一个名字和值,他们都是字符串格式.属性被大量使用在 Android 系统中,用来记录系统设置或进程之间 ...
- android基础入门布局讲解(2)
一.LinearLayout(线性布局): LinearLayout是一行或列只能放置一个控件的先行布局,现在看一个实例: activity_main.xml : <LinearLayout x ...
- Android基础 : Android Service[转]
2019独角兽企业重金招聘Python工程师标准>>> 很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用. ...
- Android基础 - Android Studio 添加游戏音效
一.资源添加 在资源文件夹res中,创建raw文件夹,放置音频(mp3.wav).视频文件:New-Folder-Raw Resource Folder 文件命名格式:开头不能是数字,不能为大写字母. ...
- 003 Android之线性布局与基础控件
文章目录 Android快速入门三步 布局介绍 LinearLayout布局属性 代码示例 基础控件 TextView和EditText 使用TextView与EditText ImageView I ...
- android表格布局bottom,Android基础_2 Activity线性布局和表格布局
在activity的布局中,线性布局和表格布局是最简单的,这次分别从线性布局,表格布局以及线性布局和表格混合布局做了实验,实验中只需要编写 相应的xml的代码,java代码不需要更改,因为我们这里只是 ...
- 亿点点概述Android基础必会的四五六【四大组件 五大存储 六大布局】
Android 四大组件 五大存储 六大布局 1. Android四大组件 1.1 Activity 1.1.1 概念 1.1.2 生命周期 1.1.3 四种启动模式 1.1.4 三种跳转方式 1.2 ...
- Android基础入门教程——2.2.3 TableLayout(表格布局)
Android基础入门教程--2.2.3 TableLayout(表格布局) 标签(空格分隔): Android基础入门教程 本节引言: 前面我们已经学习了平时实际开发中用得较多的线性布局(Linea ...
- Android基础入门教程——2.4.8 ListView Item多布局的实现
Android基础入门教程--2.4.8 ListView Item多布局的实现 标签(空格分隔): Android基础入门教程 本节引言: 本节是ListView这个小节的最后一节,给大家带来的是L ...
最新文章
- 一文搞懂转置卷积(反卷积)
- python最简单的架构_Python实现简单状态框架的方法
- SpringBoot_数据访问-整合MyBatis(二)-配置版MyBatis
- puppet 安装mysql_Puppet安装dashboard
- [BZOJ 4300]绝世好题
- 如何解决Binder泄漏问题
- 3D视界迎来全息视角,VR呈现效果海报,引领未来
- JSP和Servlet相同点和不同点?
- 主流芯片架构即将变天!
- Apache Tomcat 再爆严重安全漏洞
- CWMP协议(TR069协议)学习
- 小白系统初始化配置资源失败怎么办
- Gestalt laws
- 为何沃比帕克模式无法复制?
- 网易我的世界中国版服务器存档文件在哪里,网易我的世界怎么导入存档 网易中国版手游存档位置...
- 牛逼!百度大佬深度分享AI助力RNA二级结构预测!
- 使用imagine/imagine实现制作一个图片
- Python3环境搭建——下载Python
- 计算机组成原理TEC-8,南信大 计算机组成原理实验TEC-8实验指导书.pdf
- 鸿蒙生态班腾讯网,华为与西北工业大学达成合作,设立鸿蒙生态班
热门文章
- Jmeter录制脚本介绍
- 微信公众号内嵌H5网页授权步骤
- 进销存单机版 vb.net + access_某年某月_新浪博客
- 三维全景地图是怎么实现的?三维全景图制作教程
- html实现颜色色板,JS实现的系统调色板完整实例
- Java实现图片任意角度旋转
- pytorch提取softmax前的特征并保存为txt文件
- 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例8
- 单门课程成绩管理系统用c语言,[转载]C语言课程设计——学生成绩管理系统
- node2vec: 图数据的嵌入方法