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 ...
随机推荐
- 如何获取拼多多推流码并使用OBS进行直播-疯狂URL
简介 拼多多直播在PC端可以用多多视频|多多直播端进行开播,它的功能类似于常见的抖音直播助手和快手直播伴侣等等客户端.此教程测试时间 2023-7-12,第三方随时可能会升级,无法保证时效,建议不要升 ...
- 简单实用算法——位图算法(BitMap)
目录 算法原理 优点和缺点 算法实现(C#) 算法应用 参考文章 算法原理 BitMap的基本思想就是用一个bit位来标记某个元素对应的Value,而Key即是该元素.由于采用了Bit为单位来存储数据 ...
- 基于ads1299的可穿戴脑电信号采集之性能调试总结
一 前言 问题背景: 最近做项目,遇到了一个问题,就是采集的信号有噪声,在这里做了很多尝试. 二 测试步骤 A 内部方波信号质量,通过测试发现内部方波信号质量特别好.这个说明了软件和存储这块,没啥 ...
- 2层for循环生成 TreeView
C# TreeView 利用2层for循环生成,代码如下: //生成树 treeView1.Nodes.Clear(); //封装了数据库查询方法 MyDS_Grid = MyDataClass.ge ...
- PAT 甲级【1011 World Cup Betting】
import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; public ...
- 详解在 centos 中引导到救援模式
详解在 centos 中引导到救援模式 Linux系统CentOS进入单用户模式和救援模式详解 一.概述 目前在运维日常工作中,经常会遇到服务器异常断电.忘记root密码.系统引导文件损坏无法进入系统 ...
- Android 开发Day9
/** * Automatically generated file. DO NOT MODIFY */ package com.hui.tally; public final class Build ...
- 剖析云流送技术如何为3D应用带来用户使用便利
在过去的十年中,云游戏技术的发展为云计算行业带来了新的机遇.随着Google Stadia和GeForce Now之类的服务逐步向公众开放,云流送(cloud streaming)技术得到更大范围的应 ...
- 记录--vue.config.js 的完整配置(超详细)!
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间,对部门的个别项目进行Vue3.0+ts框架的迁移,刚开始研究的时候也是踩坑特别多,尤其我们的项目还有些特殊的webpack配置, ...
- Advanced .Net Debugging 5:基本调试任务(线程的操作、代码审查、CLR内部的命令、诊断命令和崩溃转储文件)
一.介绍 这是我的<Advanced .Net Debugging>这个系列的第五篇文章.今天这篇文章的标题虽然叫做"基本调试任务",但是这章的内容还是挺多的.上一篇我 ...