Flutter 中的绝对定位 Stack、Align、Positioned

2023-12-18 14:58

本文主要是介绍Flutter 中的绝对定位 Stack、Align、Positioned,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 一、Stack Widget 和 Align Widget 实现绝对定位
    • 1、Stack Widget
    • 2、Align Widget
    • 3、Stack + Align 实现的绝对定位
  • 二、Positioned Widget
  • 三、完整代码
    • 1、Stack + Aligment
    • 2、Stack + Positioned

 

一、Stack Widget 和 Align Widget 实现绝对定位

1、Stack Widget

HTML 中实现绝对定位使用的 absolute 属性,native 中所有的一切都是绝对定位

在 Flutter 中封装了非常方便的 Widget 来进行绝对定位

Stack Widget 是定位发生的容器,只有在 Stack 中,绝对定位的 Widget 才会生效

Stack 的构造方法非常简单:

  /// Creates a stack layout widget.////// By default, the non-positioned children of the stack are aligned by their/// top left corners.Stack({Key key,this.alignment = AlignmentDirectional.topStart,this.textDirection,this.fit = StackFit.loose,this.overflow = Overflow.clip,List<Widget> children = const <Widget>[],}) : super(key: key, children: children);

其中关键的属性就是 children,除了几个样式控制的参数之外,通过 children 可以传入一个 Widget 列表,用于表用在 Stack 中进行绝对定位的 Widget

2、Align Widget

Align 是一个 具有 Alignment 属性的 Widget,基础的属性就是 alignment,并且默认值是 Aligment.center

构造函数如下:

  const Align({Key key,this.alignment = Alignment.center,this.widthFactor,this.heightFactor,Widget child,}) : assert(alignment != null),assert(widthFactor == null || widthFactor >= 0.0),assert(heightFactor == null || heightFactor >= 0.0),super(key: key, child: child);

除了可以指定 aligment 之外,还可以传入一个 Widget 作为 子 widget

3、Stack + Align 实现的绝对定位

从 Align 的构造可以看出,通过 Stack + Align 实现的绝对定位可选择的位置是比较少的

        Stack(children: <Widget>[Align(child: Icon(Icons.home, size: 40, color: Colors.white),alignment: Alignment.topCenter,),Align(child: Icon(Icons.search, size: 40, color: Colors.pink),alignment: Alignment.bottomLeft,),Icon(Icons.settings, size: 40, color: Colors.blue),Icon(Icons.arrow_drop_down, size: 40, color: Colors.red),],alignment: Alignment.center,)

上面代码中,前两个 Widget 我是使用的 Align Widget,并且分别指定了 aligment 的属性时 topCenter 和 bottomLeft

而下面的两个 Icon,则是普通的 Widget,没有使用 Aligment

最终效果:

32666-f8f2yww8zk.png

可以发现,如果在 Stack 中不指定 Align 这种 Widget,最终的都会在 Stack 指定的 aligment 属性位置布局(示例中我设置了基于中间进行布局),而且会重叠在一起,这也和 absolute 的属性比较相似

二、Positioned Widget

相比于 Align Widget 布局的局限性(只能指定 Aligment 的几个属性),Positioned Widget 在绝对布局上更加 贴合 absolute 的方式

Positioned 提供了 left、top、right、bottom 四个属性来进行布局定位,构造方法如下:

  const Positioned({Key key,this.left,this.top,this.right,this.bottom,this.width,this.height,@required Widget child,}) : assert(left == null || right == null || width == null),assert(top == null || bottom == null || height == null),super(key: key, child: child);

Stack + Postioned 进行绝对定位布局的示例:

        Stack(children: <Widget>[Positioned(child: Icon(Icons.home, size: 40, color: Colors.white),left: 0,top: 0),Positioned(child: Icon(Icons.search, size: 40, color: Colors.pink),left: 0.4),Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),bottom: 1),],alignment: Alignment.center,)

最终效果:

50871-2hwa5fz3p2g.png

上面的结果中,第一个图片 home 坐标是 top: 0, left:0

search 图标使用的是 left:0.4

settings 图标使用的是 bottom: 1

如果使用 bottom:1, left: 1 的图标的效果是:

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),bottom: 1, left: 1),

45169-qoyfsktugf.png

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),bottom: 1, right: 1),

12628-ajqs2s11pck.png

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),top: 0.5, right: 0.5),

18551-w901cjj1cgm.png

Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),top: 0.5, right: 0.1),
Positioned(child: Icon(Icons.settings, size: 40, color: Colors.blue),top: 0),

08911-v6l0ecuzh8c.png

三、完整代码

1、Stack + Aligment

https://github.com/postbird/FlutterHelloWorldDemo/blob/master/demo1/lib/bak/main.19-Stack%20Align%20%E7%BB%84%E4%BB%B6.dart

2、Stack + Positioned

https://github.c

这篇关于Flutter 中的绝对定位 Stack、Align、Positioned的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/508814

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

Flutter Button使用

Material 组件库中有多种按钮组件如ElevatedButton、TextButton、OutlineButton等,它们的父类是于ButtonStyleButton。         基本的按钮特点:         1.按下时都会有“水波文动画”。         2.onPressed属性设置点击回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。

js定位navigator.geolocation

一、简介   html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。   window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置int watchCurrentPosition(

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

一次生产环境大量CLOSE_WAIT导致服务无法访问的定位过程

1.症状 生产环境的一个服务突然无法访问,服务的交互过程如下所示: 所有的请求都是通过网关进入,之后分发到后端服务。 现在的情况是用户服务无法访问商旅服务,网关有大量java.net.SocketTimeoutException: Read timed out报错日志,商旅服务也不断有日志打印,大多是回调和定时任务日志,所以故障点在网关和商旅服务,大概率是商旅服务无法访问导致网关超时。 后

定位cpu占用过高的线程和对应的方法

如何定位cpu占用过高的线程和对应的方法? 主要是通过线程id找到对应的方法。 1 查询某个用户cpu占用最高的进程号 top -u 用户名 2 查询这个进程中占用cpu最高的线程号 top –p 进程号-H    3 查询到进程id后把进程相关的代码打印到jstack文件 jstack -l pid > jstack.txt 4 在jstack文件中通过16进制的线程id搜索到

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录: ❄️一、栈(Stack):     ▶ 1、栈的概念:   ▶ 2、栈的使用和自实现:      ☑ 1)、Stack():       ☑ 2)、push(E e):      ☑ 3)、empty():         ☑ 4)、peek(E e):        ☑ 5)、pop(E e):       ☑ 6)、size(E e):  ▶ 3、栈自实现的总代

Autoware 定位之ndt定位(八)

0. 简介 这一讲按照《Autoware 技术代码解读(三)》梳理的顺序,我们来说一说Autoware中的ndt定位,这个软件包有两个主要功能:1. 通过扫描匹配进行位置估计,2. 通过ROS服务使用蒙特卡洛方法估计初始位置 1. 代码阅读 1.1 debug.cpp 这段代码是一个用于生成用于调试的可视化标记数组的函数。它接受时间戳、坐标系、缩放比例、粒子信息和索引作为输入,并返回一个