布局类组件



Row水平方向排列

  1. textDirection 水平方向子组件布局顺序。
  2. mainAxisSize 占用空间,默认MainAxisSize.MAX
  3. mainAxisAligment 对齐方式

    MainAxisAligment.start 初始方向对齐

    MainAxisAligment.ltr 左对齐

    MainAxisAligment.rtl 右对齐

    MainAxisAligment.end 和MainAxisAligment.start相反

    MainAxisAligment.center 居中对齐
  4. verticalDirection:处置对齐方向,默认从上到下VerticalDirection.down
  5. 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会将要监听的组件的原点(左上角)作为本次手势的原点,当用户在监听的组件上按下手指时,手势识别就会开始。

  1. DragDownDetails.globalPosition:当用户按下时,此属性为用户按下的位置相对于屏幕(而非父组件)原点(左上角)的偏移。
  2. DragUpdateDetails.delta:当用户在屏幕上滑动时,会触发多次Update事件,delta指一次Update事件的滑动的偏移量。
  3. 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笔记 - 布局类组件的更多相关文章

  1. 【Flutter】布局类组件之对齐和相对定位

    前言 如果只想简单的调整一个子元素在父元素中的位置的话,使用Align组件会更简单一些. 接口描述 const Align({ Key key, // 需要一个AlignmentGeometry类型的 ...

  2. Flutter 布局类组件:简介

    前言 布局类组件都会包含一个或多个子组件,不同的布局类组件对子组件排版(layout)方式不同. 我们知道,Element树才是最终的绘制树,Element树是通过Widget树来创建的(通过Widg ...

  3. Flutter 布局类组件:层叠布局(Stack和Positioned)

    前言 层叠布局,即子组件可以根据距父容器四个角的位置来确定自身的位置.绝对定位运行子组件堆叠起来,即按照代码中声明的顺序. Flutter中使用Stack和Positioned这两个组件来配合实现绝对 ...

  4. Flutter 布局类组件:流式布局(Wrap和Flow)

    前言 把超出屏幕显示范围会自动折行的布局称为流式布局.Flutter中通过Wrap和Flow来支持流式布局,将Row换成Wrap后溢出部分则会自动折行. Wrap 接口描述 Wrap({ Key ke ...

  5. Flutter 布局类组件:弹性布局(Flex)

    前言 弹性布局允许子组件按照一定比例来分配父容器空间,Flutter中的弹性布局主要通过Flex和Expanded来配合实现. Flex Flex组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方 ...

  6. Flutter 布局类组件:线性布局(Row和Column)

    前言 所谓线性布局,即指沿水平或垂直方向排布子组件.Flutter中通过Row和Column来实现线性布局,并且它们都继承自弹性布局(Flex). 接口描述 Row({ Key key, // 表示子 ...

  7. 13Flutter页面布局 Wrap组件

    /* Flutter页面布局Wrap组件: Wrap可以实现流布局,单行的Wrap跟Row表现几乎一致,单列的Wrap则跟Row表现几乎一致. 但Row与Column都是单行单列的.Wrap则突破了这 ...

  8. Flutter 容器Container类和布局Layout类

    1.布局和容器 [布局]是把[容器]按照不同的方式排列起来. Scaffold包含的主要部门:appBar,body,bottomNavigator 其中body可以是一个布局组件,也可以是一个容器组 ...

  9. Flutter 裁剪类组件 最全总结

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 ClipRect ClipRect组件使用矩形裁剪子组件, ...

  10. 你真的会用Flutter日期类组件吗

    Flutter系统提供了一些日期选择类组件,比如DayPicker.MonthPicker.YearPicker.showDatePicker.CupertinoDatePicker等,其中前4个为M ...

随机推荐

  1. Spring事务(五)-事务隔离级别

    Spring @Transactional注解isolation属性 @Transactional注解通过isolation属性设置事务隔离级别.如下: @Transactional(isolatio ...

  2. 软件推荐 Notable / 现改用 Vnote 了

    https://notable.app/#download

  3. 异步小工具 asyncTool

    class asyncTool { constructor () { this.arr = [] this.ctx = {} } use (func) { const into = { func, n ...

  4. CYQ.Data 操作 Redis 性能测试:对比 StackExchange.Redis

    前言: 前几天,点开自己的博客,看了一下 CYQ.Data V5系列 都有哪些文章, 发现了一篇2019年写的:CYQ.Data 对于分布式缓存Redis.MemCache高可用的改进及性能测试,于是 ...

  5. using用法总结

    一.命名空间的使用 不再赘述. 二.在子类中改变基类成员的访问权限 using可以将public和protected的基类成员的访问权限改为public.protected.private,注意,us ...

  6. 关于全景(360)图片拼接的方法(Opencv3.0 Stitcher)----续(一)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. C 可变参数函数分析(va_start,va_end,va_list...)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. 活动报名|3DCAT实时渲染云行业生态合作系列沙龙之“云XR如何赋能虚拟仿真实验教学”线上活动邀您参会

    当前,虚拟现实发展方兴未艾,"XR+教育"融合发展前景广阔. 3DCAT实时渲染云积极联动教育行业渠道商等生态合作伙伴,合力打造"虚拟现实实验室"." ...

  9. 记录--怎么实现一个3d翻书效果

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现: 第一种是整页翻转的效果: 这种整页翻转的效果主要是做rotateY的动画,并结合一些CSS的3d属性 ...

  10. 记录--vue脚手架

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.vue脚手架 1.简介 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统. 2.命令行操作步骤 npm install ...