记录:移动设备软件开发(layout六大布局)

news2024/11/21 2:27:47

目录

  • 前言
  • layout
  • LinearLayout线性布局
    • LinearLayout的常用属性
      • Android:orientation属性
      • Android:gravity属性
  • TableLayout表格布局
    • TableLayout的常用属性
      • collapsecolumns属性
      • shrinkcolums属性
      • stretchcoumns属性
  • RelativeLayout相对布局
  • Absolute Layout绝对布局
    • Absolute Layout的常用属性
  • FrameLayout帧布局
    • FrameLayout的常用属性
      • android:foreground
      • android:foregroundGravity
  • Constraint layout约束布局
    • 为什么要使用约束布局
    • Constraint layout的常用属性
  • 总结

前言

之前写到了关于activity的显式启动和隐式启动,也就是关于Intent对象启动activity的不同方式,今天就来简单记录一下Android开发中关于layout的不同布局方式

layout

layout就是布局,在前面也写到过关于Android项目结构中存放布局文件的layout文件夹,为了让组件(TextView,Button等)在不同的手机屏幕上都能运行良好(不同手机屏幕分辨率、尺寸并不完全相同),如果让程序手动控制每个组件的大小、位置,则将给编程带来巨大的困难,为了解决这个问题,Android提供了布局管理器。布局定义了应用中的界面结构(例如 Activity 的界面结构)。布局中的所有元素均使用 View 和 ViewGroup 对象的层次结构进行构建。View 通常用于绘制用户可看到并与之交互的内容。ViewGroup 则是不可见的容器,用于定义 View 和其他 ViewGroup 对象的布局结构,如图所示
定义了一个界面布局
每当Acitivity.setContentView(@LayoutRes int layoutResID)方法被调用,或者一个View通过LayoutInflater对象inflater出来,那么相关的布局文件就会被加载并解析出来。XML文件中每个大写的XML节点对应着一个View对象,他们被系统实例化。在Acitviity或者Fragment的整个生命周期中,他们都是UI层级的一部分。这会影响到应用程序使用过程中的分配
在这里插入图片描述
Android的布局管理器本身就是个UI组件,所有的布局管理器都是ViewGroup的子类,而ViewGroup是View的子类,所以布局管理器可以当成普通的UI组件使用,也可以作为容器类使用,可以调用多个重载addView()向布局管理器中添加组件,并且布局管理器可以互相嵌套,当然不推荐过多的嵌套(如果要兼容低端机型,最好不要超过5层)

LinearLayout线性布局

LinearLayout又称作线性布局,是一种非常常用的布局。正如它的名字所描述的一样,这个布局会将它所包含的控件在线性方向上依次排列。既然是线性排列,肯定就不仅只有一个方向,这里一般只有两个方向:水平方向和垂直方向。主要以水平或垂直方式来排列界面中的控件。并将控件排列到一条直线上。在线性布局中,如果水平排列,垂直方向上只能放一个控件,如果垂直排列,水平方向上也只能方一个控件。
使用线性布局,需要将布局节点改成LinearLayout,基本格式如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 ....
    
</LinearLayout>

LinearLayout的常用属性

Android:orientation属性

用于控制线性布局的朝向
在线性布局中,控件排列有水平和垂直两个方向,控件排列方向由android:orientation属性来控制,该属性需要加在LinearLayout标记的属性中

Android:gravity属性

用于设置线性布局内部的元素布局方式
线性布局的控件默认是从左往右排列或从上往下排列,如果想让线性布局中的控件排列对齐右边缘或者底部,可以用gravity属性控制
不过该属性值并不是只有在LinearLayout中才能使用,其他的布局用该属性同样能生效

TableLayout表格布局

TableLayout (表格布局)采用行、列的形式来管理控件,它不需要明确声明包含多少行、多少列,面是通过在TableLayout布局中添加TableRow布局或控件来控制表格的行数,可以在TableRow 布局中添加控件来控制表格的列数。在XML布局文件中定义表格布局的基本语法格式如下:

<TableLayout xmlns:android-"http://schemas.android.com/apk/res/android" 
	属性-”属性值">
<TableRow>
UI控件
</TableRow>

UI控件
</TableLayout>

TableLayout继承自LinearLayout, 因此它完全支持LinearLayout所支持的属性,此外,它还有其他的常用属性

TableLayout的常用属性

collapsecolumns属性

用于设置指定的列为collapse(也就是隐藏)
设置可被隐藏的列,如:android:collapseColumns=~0”, 表示第1列可被隐藏

shrinkcolums属性

用于收缩宽度自适应父容器的大小
设置可被收缩的列,如:android:shrinkColumns=“1. 2”, 表示2, 3列可收编

stretchcoumns属性

用于拉伸,填充满表格
设置可被拉伸的列。如:android:stretchColumns-~0”, 表示第1列可被拉伸

RelativeLayout相对布局

相对布局(RelativeLayout)是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。
核心属性

使用LinearLayout的时候也有一个问题,就是当界面比较复杂的时候,需要嵌套多层的 LinearLayout,这样就会降低UI Render的效率(渲染速度),而且如果是listview或者GridView上的 item,效率会更低,另外太多层LinearLayout嵌套会占用更多的系统资源,还有可能引发stackoverflow; 但是如果我们使用RelativeLayout的话,可能仅仅需要一层就可以完成了,以父容器或者兄弟组件参考+margin +padding就可以设置组件的显示位置,是比较方便的!当然,也不是绝对的,具体问题具体分析吧! 总结就是:尽量使用RelativeLayout + LinearLayout的weight属性搭配使用

在这里插入图片描述

Absolute Layout绝对布局

绝对布局(Absolute Layout)就是指定元素的position属性为absloute,元素被指定为绝对定位后,浏览器会将其从流中删除

与浮动布局不同,浮动布局中浮动起来的元素,只是“半删除”。即对HTML端的块元素来说浮动起来的元素仿佛从流中被删除了。但对HTML端的内联元素来说浮动起来的元素仍旧存在

绝对布局就不是“半删除”了,而是从HTML流中彻底删除该元素。被删除的元素和原始HTML流中其他元素,处于不同层面,这就产生了分层的概念

绝对布局是前端布局中最为简单的布局,但灵活性极差,不具有自动适应设备分辨率的能力,就好比在手机上设置的布局,在平板上布局就会全部混乱,所以在日常开发中很少使用绝对布局

Absolute Layout的常用属性

在这里插入图片描述

FrameLayout帧布局

FrameLayout(帧布局)可以说是六大布局中最为简单的一个布局,这个布局直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角,而这种布局方式却没有任何的定位方式,所以它应用的场景并不多;帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看到最上面的那个组件!后续添加的控件会覆盖前一个!虽然默认会将控件放置在左上角,但是我们也可以通过layout_gravity属性,指定到其他的位置!
使用后面的画面覆盖前面的画面,从而实现动画的效果

FrameLayout的常用属性

FrameLayout的属性很少就两个,但是在说之前我们先介绍一个东西:

前景图像:永远处于帧布局最上面,直接面对用户的图像,就是不会被覆盖的图片。

两个属性:

android:foreground

设置改帧布局容器的前景图像

android:foregroundGravity

设置前景图像显示的位置

Constraint layout约束布局

ConstraintLayout 是一个 ViewGroup,它的出现是为了解决复杂布局时,布局嵌套(布局内的布局)过多的问题(嵌套布局会增加绘制界面所需的时间)。它可以根据同级视图和父布局的约束条件为每个视图定义位置,类似于 RelativeLayout 所有视图都是根据兄弟视图和父级布局之间的关系来布局的,但是与 RelativeLayout 相比,它更加灵活,更易于使用。

在 Android 2.2 的版本中,为了给 ConstraintLayout 提供支持,Android 设计了新的布局编辑器。我们可以直接在布局编辑器当中拖动控件、添加约束,一气呵成。当然,在布局编辑器当中所做的操作,XML 布局当中就会自动生成对应的属性。

其中生成的一些属性,有可能并不是必须需要的。所以在生成后,你可能还需要手动检查、清理一下。或者你也可以直接在 XML 中编写属性,ConstraintLayout 的属性虽多,但是都是成组的,还是很容易掌握的。

为什么要使用约束布局

在开发过程中经常能遇到一些复杂的UI,可能会出现布局嵌套过多的问题,嵌套得越多,设备绘制视图所需的时间和计算功耗也就越多。简单举个例子:

假设现在要写一个这样的布局,可能有人会这么写:
首先是一个垂直的LinearLayout,里面放两个水平的LinearLayout,然后在水平的LinearLayout里面放TextView。这样的写法就嵌套了两层LinearLayout。
在这里插入图片描述

有些人考虑到了嵌套布局带来的风险,所以用一个RelativeLayout来装下所有的控件。那么问题来了,既然用RelativeLayout可以解决问题,为什么还要使用ConstraintLayout呢?因为ConstraintLayout使用起来比RelativeLayout更灵活,性能更出色!还有一点就是ConstraintLayout可以按照比例约束控件位置和尺寸,能够更好地适配屏幕大小不同的机型

Constraint layout的常用属性

下面来看看相对定位的常用属性:
layout_constraintLeft_toLeftOf
layout_constraintLeft_toRightOf
layout_constraintRight_toLeftOf
layout_constraintRight_toRightOf
layout_constraintTop_toTopOf
layout_constraintTop_toBottomOf
layout_constraintBottom_toTopOf
layout_constraintBottom_toBottomOf
layout_constraintBaseline_toBaselineOf
layout_constraintStart_toEndOf
layout_constraintStart_toStartOf
layout_constraintEnd_toStartOf
layout_constraintEnd_toEndOf

总结

以上就是关于layout的六大布局的一些记录,当然,只是一些简单的记录,并没有对其内容进行深挖和研究,在此就先按下不表,后面有机会可以进行一下研究

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105132.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习笔记——基本类型、函数、输入和输出

食用说明&#xff1a;本笔记适用于有一定编程基础的伙伴们。希望有助于各位&#xff01; 基础类型 常用的简单类型有str&#xff0c;float&#xff0c;int&#xff0c;bool等&#xff0c;常见的复杂数据类型有function&#xff0c;type&#xff0c;list&#xff0c;tuple&…

SAP_MMPV创建自动任务每月底自动开下月物料账

SAP_MMPV创建自动任务每月底自动开下月物料账 1、MMPV设置变式 输入事务代码MMPV进入物料开账界面&#xff0c;输入公司代码&#xff0c;注意开账月份与时间等都不输入&#xff0c;点击保存按钮&#xff0c;如下图。 输入变式名称、描述&#xff0c;将变式设置为“仅用于后台…

程序的编译(预处理操作)+链接

目录 前言&#xff1a; 1. 程序的翻译环境和执行环境&#xff1a; 2. 详解编译链接 翻译环境&#xff1a; 1.预处理&#xff1a;&#xff08;文本操作&#xff09; 2.编译&#xff1a; 3.汇编&#xff1a; 4.链接&#xff1a; 运行环境 预处理详解 &#xff1a; #defi…

Hash Join(PostgreSQL 14 Internals翻译版)

一阶段哈希连接&#xff08;One-Pass Hash Joins&#xff09; 散列连接使用预构建的散列表搜索匹配的行。下面是一个使用这种连接的计划的例子&#xff1a; 在第一阶段&#xff0c;哈希连接节点1调用哈希节点2&#xff0c;哈希节点2从其子节点提取整个内部行集&#xff0c;并将…

Python 面向对象初步

目录 1 面向对象和面向过程区别1.1 面向过程(Procedure Oriented)思维1.2 面向对象(Object Oriented)思维1.3 面向对象思考方式1.4 面向对象和面向过程的总结 2 对象的进化3 类的定义4 __init__构造方法和__new__方法5 实例属性和实例方法5.1 实例属性5.2 实例方法5.2.1 实例对…

【学术】知云文献及划词翻译软件(XTranslator)的安装及使用

文章目录 一、知云文献翻译1.1 知云文献翻译是什么1.2 知云文献翻译下载地址1.3 知云文献翻译安装1.4 知云文献翻译使用1.4.1 使用方法1.4.2 解除限制1.4.3 软件特点1.4.4 翻译PDF 1.5 Windows版使用文档1.6 解锁所有翻译引擎 二、知云划词翻译(Xtranslator)2.1 知云划词翻译(X…

C# Winform编程(5)菜单和菜单组件

菜单和菜单组件 添加菜单编辑菜单 添加菜单 将MenuStrip控件拖拽到Form窗体顶部添加菜单 编辑菜单 添加菜单项&#xff0c;编辑菜单属性等功能。 右键单击已添加的菜单项可以弹出右键菜单&#xff1a; 可以设置菜单图标&#xff0c;使能菜单&#xff0c;显示快捷键、转换菜…

提高三维模型数据的几何坐标精度需要采取方法浅析

提高三维模型数据的几何坐标精度需要采取方法浅析 要提高倾斜摄影三维模型数据的几何坐标精度&#xff0c;可以采取以下方法&#xff1a; 选择合适的倾斜角度&#xff1a;倾斜角度对于几何坐标精度具有重要影响。过小的倾斜角度可能导致图像中特征点不足以提供准确的位置信息&…

10数据库-基础

四、数据库 15、MySQL 数据库优化 SQL优化 mysql优化 一、避免不走索引的场景尽量避免在字段开头模糊查询&#xff0c;会导致数据库引擎放弃索引进行全表扫描。尽量避免使用not in&#xff0c;会导致引擎走全表扫描。尽量避免使用 or&#xff0c;会导致数据库引擎放弃索引进行…

[opencv]图像和特征点旋转

本来说这是很简单的一个内容&#xff0c;图像旋转只需要使用opencv中自带的旋转函数即可完成&#xff0c;但是最近在做特征点旋转的时候发现使用内置rotate函数给图像旋转90度&#xff0c;再用getRotationMatrix2D得出的旋转矩阵对特征点旋转&#xff0c;画出来的特征点位置全部…

零基础学习HTML5

1. 使用软件 vscode 谷歌浏览器 vscode下载地址&#xff1a;https://code.visualstudio.com/ 谷歌可以使用360软件管家安装 2. 安装插件 在vscode中安装插件&#xff1a;open in browser&#xff0c;点击Extensions后搜索对应插件名然后点击安装Install 安装完成后可在htm…

【LeetCode】543. 二叉树的直径

543. 二叉树的直径&#xff08;简单&#xff09; 思路 对于任一结点&#xff0c;以此结点为根的diameter就可以表示为左子树高度 右子树高度&#xff0c;而二叉树的diameter就是所有结点为根的diameter中最大的那个。因此&#xff0c;变量 maxLen 用来保存当前遍历过的节点的…

phpstudy_2016-2018_rce_backdoor 漏洞复现

phpstudy_2016-2018_rce_backdoor 漏洞复现 Remote Command Execute 打开 bp 打开代理浏览器 访问 php 页面 回到 bp 查看 http 历史&#xff0c;找到刚刚访问的 php 页面 发送到 Repeater 转到 Repeater php 页面请求内容加 Accept-Charset: 修改 Accept-Encodi…

Comsol电磁铁仿真

简介 Comsol是一款多物理场仿真软件&#xff0c;可以完成固体力学、流体力学、传热学和电磁学的仿真。本文将介绍使用Comsol完成电磁铁仿真的主要流程&#xff0c;计算铁芯的受力。 步骤 1.建立模型并设置材料 建立二维旋转对称模型&#xff0c;绿色为动铁&#xff0c;材料…

STM32F103外部晶振8MHZ改为16MHz的使用

STM32F103外部晶振8MHZ改为16MHz的使用 目录 STM32F103外部晶振8MHZ改为16MHz的使用前言一、修改标准函数库的方法1、stm32f10x.h修改HSE_VALUE2 、system stm32f10x.c的SetSysClockTo72&#xff08;&#xff09;函数修改3、不同晶振的统一配置的方式4 、时间晶振修改5、修改Ta…

基于STM32F407的FreeRTOS学习笔记(1)——环境搭建

以前使用STM32单片机一直停留在逻辑开发以及前后台系统&#xff0c;而真正被广泛使用的则是RTOS。 前后台系统则是我们常用的&#xff0c;使用一个主循环许多的调用函数这些构成了后系统&#xff0c;利用中断进行异常处理则是前系统。 而RTOS则是将任务按照优先级排列&#xf…

怎么压缩图片?图片过大这样压缩变小

在日常生活中&#xff0c;我们常常会遇到需要上传或发送图片的情况&#xff0c;然而&#xff0c;很多时候图片的大小会成为问题&#xff0c;因为过大的图片可能会导致传输速度变慢&#xff0c;甚至无法上传。那么&#xff0c;如何将这些过大的图片压缩变小呢&#xff1f; 一、嗨…

【C++进阶之路】类型转换

文章目录 类型转换1.C语言的类型转换1.1整形提升1.2算术转换1.3强制类型转换 2.C类型转换2.1static_cast2.2reinterpret_cast2.3const_cast2.3dynamic_cast 总结 类型转换 1.C语言的类型转换 1.1整形提升 在写顺序表的插入函数时&#xff0c;我们的接口实现是这样的&#xf…

Confluence 自定义展示页面

1. 概述 Confluence 作为知识库可通过JS脚本方式&#xff0c;根据登录用户或用户组进行前端页面的自定义 2. 实现方式 Confluence →管理→自定义HTML 嵌入对应JS脚本&#xff0c;示例如下 <script type"text/javascript">jQuery(#footer).html(<div>…

UE5 Python脚本自动化Sequence Key帧

前言 码上1024了&#xff0c;给大家分享一个UE5的脚本小功能&#xff0c;UE5中Sequence动态Key功能&#xff0c;这样我们就可以根据我们的数据动态更新了&#xff0c;非常实用&#xff0c;适合刚入门或者小白&#xff0c;接下来我就把整个过程分享给大家。 过程 新建一个工程…