Flutter笔记 - 布局类组件
布局类组件

Row水平方向排列
- textDirection 水平方向子组件布局顺序。
- mainAxisSize 占用空间,默认MainAxisSize.MAX
- mainAxisAligment 对齐方式
MainAxisAligment.start 初始方向对齐
MainAxisAligment.ltr 左对齐
MainAxisAligment.rtl 右对齐
MainAxisAligment.end 和MainAxisAligment.start相反
MainAxisAligment.center 居中对齐 - verticalDirection:处置对齐方向,默认从上到下VerticalDirection.down
- crossAxisAligment 子组件纵轴对齐方式
crossAxisAligment.start 顶部对齐
crossAxisAligment.start 底部对齐
children:子组件数组
弹性布局Flex
沿着水平或者垂直方向排列。
flex 比例
Spacer为Expandes的包装类
import 'package:flutter/material.dart';
class FlexLayoutRouter extends StatelessWidget {
const FlexLayoutRouter({super.key});
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Flex(
direction: Axis.horizontal,
children: <Widget>[
Expanded(
flex: 2,
child: Container(
height: 30,
color: Colors.green,
)),
Expanded(
flex: 1,
child: Container(
height: 30,
color: Colors.green,
))
],
),
Padding(
padding: const EdgeInsets.only(top: 20.0),
child: SizedBox(
height: 100,
child: Flex(
direction: Axis.horizontal,
children: <Widget>[
Expanded(
flex: 1,
child: Container(
height: 30,
color: Colors.grey,
)),
const Spacer(
flex: 2,
),
Expanded(
flex: 1,
child: Container(
height: 30,
color: Colors.black,
)),
],
),
),
)
],
);
}
}
流式布局
spaceing:主轴子Widget间距。
runSpacing:纵轴间距。
runAligment:纵轴对齐方式。
例子:
import 'package:flutter/material.dart';
class WrapRoute extends StatelessWidget{
const WrapRoute({super.key});
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
Wrap(
spacing: 8.0,
runSpacing: 4.0,
alignment: WrapAlignment.center,
children: const <Widget>[
Chip(label: Text("A"),
avatar: CircleAvatar(backgroundColor: Colors.blue,child: Text("A")),
),
Chip(label: Text("B"),
avatar: CircleAvatar(backgroundColor: Colors.blue,child: Text("B")),
),
Chip(label: Text("C"),
avatar: CircleAvatar(backgroundColor: Colors.blue,child: Text("C")),
),
Chip(label: Text("D"),
avatar: CircleAvatar(backgroundColor: Colors.blue,child: Text("D")),
),
],
)
],
);
}
}
GestureDetector
一次完整的手势过程是指用户手指按下到抬起的整个过程,期间,用户按下手指后可能会移动,也可能不会移动。GestureDetector对于拖动和滑动事件是没有区分的,他们本质上是一样的。GestureDetector会将要监听的组件的原点(左上角)作为本次手势的原点,当用户在监听的组件上按下手指时,手势识别就会开始。
- DragDownDetails.globalPosition:当用户按下时,此属性为用户按下的位置相对于屏幕(而非父组件)原点(左上角)的偏移。
- DragUpdateDetails.delta:当用户在屏幕上滑动时,会触发多次Update事件,delta指一次Update事件的滑动的偏移量。
- DragEndDetails.velocity:该属性代表用户抬起手指时的滑动速度(包含x、y两个轴的),示例中并没有处理手指抬起时的速度,常见的效果是根据用户抬起手指时的速度做一个减速动画。
import 'package:flutter/material.dart';
class DragWidget extends StatefulWidget {
const DragWidget({super.key});
@override
DragState createState() => DragState();
}
class DragState extends State<DragWidget>
with SingleTickerProviderStateMixin<DragWidget> {
double _top = 0.0;
double _left = 0.0;
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Positioned(
top: _top,
left: _left,
child: GestureDetector(
child: const CircleAvatar(child: Text("A")),
// 手指按下,全局位置
onPanDown: (DragDownDetails e) {
print("按下:${e.globalPosition}");
},
// 滑动过程中
onPanUpdate: (DragUpdateDetails e) {
setState(() {
// dx 为x轴偏移量
_left = _left + e.delta.dx;
_top = _top + e.delta.dy;
});
},
// 滑动结束的时候
onPanEnd: (DragEndDetails e) {
print("速度:${e.velocity}");
},
))
],
);
}
}
onScaleUpdate 缩放监听
import 'package:flutter/material.dart';
class ZoomWidget extends StatefulWidget {
const ZoomWidget({super.key});
@override
ZoomWidgetState createState() => ZoomWidgetState();
}
class ZoomWidgetState extends State<ZoomWidget> {
double _width = 200.0; //通过修改图片宽度来达到缩放效果
@override
Widget build(BuildContext context) {
return Center(
child: GestureDetector(
child: Image.asset("./graphics/ic_launcher.png"),
onScaleUpdate: (ScaleUpdateDetails details) {
setState(() {
_width = 200 * details.scale.clamp(.8, 10.0);
});
},
),
);
}
}
GestureRecognizer
GestureRecognizer的作用就是通过 Listener来将原始指针事件转换为语义手势,GestureDetector直接可以接收一个子widget。
例子:变颜色的TextSpan
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
class ChangeColorWidget extends StatefulWidget {
const ChangeColorWidget({super.key});
@override
ChangeColorWidgetState createState() => ChangeColorWidgetState();
}
class ChangeColorWidgetState extends State<ChangeColorWidget> {
// 手势识别器
TapGestureRecognizer tapGestureRecognizer = TapGestureRecognizer();
//手势开关
bool toggle = false;
@override
Widget build(BuildContext context) {
return Center(
child: Text.rich(TextSpan(
text: "点我变颜色",
style: TextStyle(
fontSize: 30,
color: toggle ? Colors.green : Colors.red,
),
recognizer: tapGestureRecognizer
..onTap = () {
setState(() {
toggle = !toggle;
});
},
)),
);
}
}
Flutter笔记 - 布局类组件的更多相关文章
- 【Flutter】布局类组件之对齐和相对定位
前言 如果只想简单的调整一个子元素在父元素中的位置的话,使用Align组件会更简单一些. 接口描述 const Align({ Key key, // 需要一个AlignmentGeometry类型的 ...
- Flutter 布局类组件:简介
前言 布局类组件都会包含一个或多个子组件,不同的布局类组件对子组件排版(layout)方式不同. 我们知道,Element树才是最终的绘制树,Element树是通过Widget树来创建的(通过Widg ...
- Flutter 布局类组件:层叠布局(Stack和Positioned)
前言 层叠布局,即子组件可以根据距父容器四个角的位置来确定自身的位置.绝对定位运行子组件堆叠起来,即按照代码中声明的顺序. Flutter中使用Stack和Positioned这两个组件来配合实现绝对 ...
- Flutter 布局类组件:流式布局(Wrap和Flow)
前言 把超出屏幕显示范围会自动折行的布局称为流式布局.Flutter中通过Wrap和Flow来支持流式布局,将Row换成Wrap后溢出部分则会自动折行. Wrap 接口描述 Wrap({ Key ke ...
- Flutter 布局类组件:弹性布局(Flex)
前言 弹性布局允许子组件按照一定比例来分配父容器空间,Flutter中的弹性布局主要通过Flex和Expanded来配合实现. Flex Flex组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方 ...
- Flutter 布局类组件:线性布局(Row和Column)
前言 所谓线性布局,即指沿水平或垂直方向排布子组件.Flutter中通过Row和Column来实现线性布局,并且它们都继承自弹性布局(Flex). 接口描述 Row({ Key key, // 表示子 ...
- 13Flutter页面布局 Wrap组件
/* Flutter页面布局Wrap组件: Wrap可以实现流布局,单行的Wrap跟Row表现几乎一致,单列的Wrap则跟Row表现几乎一致. 但Row与Column都是单行单列的.Wrap则突破了这 ...
- Flutter 容器Container类和布局Layout类
1.布局和容器 [布局]是把[容器]按照不同的方式排列起来. Scaffold包含的主要部门:appBar,body,bottomNavigator 其中body可以是一个布局组件,也可以是一个容器组 ...
- Flutter 裁剪类组件 最全总结
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 ClipRect ClipRect组件使用矩形裁剪子组件, ...
- 你真的会用Flutter日期类组件吗
Flutter系统提供了一些日期选择类组件,比如DayPicker.MonthPicker.YearPicker.showDatePicker.CupertinoDatePicker等,其中前4个为M ...
随机推荐
- MySQL学习之初识数据库
•数据库的相关概念 DB : 数据库,保存一组有组织的数据的容器 DBMS : 数据库管理系统,又称为数据库软件(产品),用于管理 DB 中的数据 SQL : 结构化查询语言,用于和 DBMS 通信的 ...
- Nginx-负载均衡系列
综合架构-负载均衡系列 目录 综合架构-负载均衡系列 一个新的开始 一 代理模块 proxy 2.1 概述 2.2 正向代理用户 2.3 反向代理 2.4 反向代理环境准备 2.5 反正代理指令 二 ...
- C# 中使对象序列化/反序列化 Json 支持使用派生类型以及泛型的方式
C# 中使对象序列化/反序列化 Json 支持使用派生类型以及泛型方式 废话 前言 为啥想写这个博客 最近自己写的框架有用到这个 类似工作流,支持节点编码自定义,动态运行自定义. 尽量减少动态解析这就 ...
- electron-vite 可用,本机软件开发环境搭建
electron-vite 可用,本机软件开发环境搭建 https://electron-vite.github.io/
- Spring之事务传播属性
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量. 在使用Spring时,大部分会用到他的声明式事务,简单的在配置文件中进行一些规则 ...
- 深入浅出Java多线程(十三):阻塞队列
引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十三篇内容:阻塞队列.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在多线程编程的世界里,生产者-消费者问 ...
- Python爬虫实战系列4:天眼查公司工商信息采集
Python爬虫实战系列1:博客园cnblogs热门新闻采集 Python爬虫实战系列2:虎嗅网24小时热门新闻采集 Python爬虫实战系列3:今日BBNews编程新闻采集 Python爬虫实战系列 ...
- ts-对象数组reduce-数组转对象数组
将字符串数组转化成{name:xxx,count:xxx}[]数组的代码 #定义数据类型 interface CartInfo{ name:string, count:number } let raw ...
- 记录--Vue 右键菜单的秘密:自适应位置的实现方法
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 下图这个情景,你是否也遇到过? 当你右键点击网页上的某个元素时,弹出的菜单被屏幕边缘遮挡了,导致你无法看清或选择菜单项? 上图中右键菜单的 ...
- KingbaseES V8R3 备份恢复系列之 -- sys_rman备份过程分析
案例说明: 本案例通过对KingbaseES sys_rman物理备份过程的详细描述,有助于在执行sys_rman过程中发生故障的分析. 适用版本: KingbaseES V8R3 一.sys_r ...