flutter-布局学习
flutter 布局学习
RowWidget 横向布局
- 不灵活布局
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Row Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("水平方向布局"),),body: new Row(children: <Widget>[new RaisedButton(onPressed: () {},color: Colors.red,child: new Text('red button'),),new RaisedButton(onPressed: () {},color: Colors.orangeAccent,child: new Text('orange button'),),new RaisedButton(onPressed: () {},color: Colors.lightBlue,child: new Text('blue button'),),],),),);}
}
这时候你会发现的页面已经有了三个按钮,但这三个按钮并没有充满一行,而是出现了空隙。这就是不灵活横向排列造成的。它根据子元素的大小来进行排列。如果我们想实现充满一行的效果,就要使用灵活水平布局了。
- 灵活水平布局
解决上面有空隙的问题,可以使用 Expanded来进行解决,也就是我们说的灵活布局。我们在按钮的外边加入Expanded就可以了,代码如下:
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Row Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("水平方向布局"),),body: new Row(children: <Widget>[Expanded(child: new RaisedButton(onPressed: () {},color: Colors.red,child: new Text('red button'),),),Expanded(child: new RaisedButton(onPressed: () {},color: Colors.yellow,child: new Text('yellow button'),),),Expanded(child: new RaisedButton(onPressed: () {},color: Colors.lightBlue,child: new Text('blue button'),),),],),),);}
}
这时候就可以布满一行了,效果如下图。
- 灵活和不灵活的混用
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Row Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("水平方向布局"),),body: new Row(children: <Widget>[new RaisedButton(onPressed: () {},color: Colors.red,child: new Text('red button'),),Expanded(child: new RaisedButton(onPressed: () {},color: Colors.yellow,child: new Text('yellow button'),),),new RaisedButton(onPressed: () {},color: Colors.lightBlue,child: new Text('blue button'),)],),),);}
}
ColumnWidget 纵向布局
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],),),);}
}
这时候你会发现文字是以最长的一段文字居中对齐的,看起来很别扭。那如果想让文字以左边开始对齐,只需要加入一个对齐属性。
- CrossAxisAlignment.star:居左对齐。
- CrossAxisAlignment.end:居右对齐。
- CrossAxisAlignment.center:居中对齐
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],),),);}
}
主轴和副轴的辨识
在设置对齐方式的时候你会发现右mainAxisAlignment属性,意思就是主轴对齐方式,那什么是主轴,什么又是幅轴那。
main轴:如果你用column组件,那垂直就是主轴,如果你用Row组件,那水平就是主轴。
cross轴:cross轴我们称为幅轴,是和主轴垂直的方向。比如Row组件,那垂直就是幅轴,Column组件的幅轴就是水平方向的。
主轴和幅轴我们搞清楚,才能在实际工作中随心所欲的进行布局。
比如现在我们要把上面的代码,改成垂直方向居中。因为用的是Column组件,所以就是主轴方向,这时候你要用的就是主轴对齐了。
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],),),);}
}
水平方向相对屏幕居中
让文字相对于水平方向居中,我们如何处理?其实只要加入Center组件就可以轻松解决。
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: new Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text("hanyajun"),Text("hanyajun.com"),Text("I love coding"),],)),),);}
}
Expanded属性的使用
其实在学习水平布局的时候我们对Expanded有了深刻的理解,它就是灵活布局。比如我们想让中间区域变大,而头部区域和底部根据文字所占空间进行显示。
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: new Column(crossAxisAlignment: CrossAxisAlignment.center,mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Center(child: Text("hanyajun")),Expanded(child: Center(child: Text("hanyajun.com"))),Center(child: Text("I love coding")),],),),);}
}
Stack Widget 层叠布局
在头像上方再放入一个容器,容器里边写上字,这时候我们就可以使用Stack布局。
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {var stack = new Stack(alignment: const FractionalOffset(0.5, 0.8),//设置对齐方式0-1children: <Widget>[new CircleAvatar(backgroundImage: new NetworkImage("https://hanyajun.com/img/avatar/self.jpg"),radius: 100.0, //半径),new Container(decoration: new BoxDecoration(color: Colors.lightBlue,),padding: EdgeInsets.all(5.0),child: new Text("hanyajun"),),],);return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: stack,),),);}
}
层叠布局的 alignment 属性
alignment属性是控制层叠的位置的,建议在两个内容进行层叠时使用。它有两个值X轴距离和Y轴距离,值是从0到1的,都是从上层容器的左上角开始算起的。CircleAvatar组件的使用
CircleAvatar这个经常用来作头像的,组件里边有个radius的值可以设置图片的弧度。
Positioned属性
- Positioned组件的属性
- bottom: 距离层叠组件下边的距离
- left:距离层叠组件左边的距离
- top:距离层叠组件上边的距离
- right:距离层叠组件右边的距离
- width: 层叠定位组件的宽度
- height: 层叠定位组件的高度
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {var stack = new Stack(//alignment: const FractionalOffset(0.5, 0.8), //设置对齐方式0-1children: <Widget>[new CircleAvatar(backgroundImage: new NetworkImage("https://hanyajun.com/img/avatar/self.jpg"),radius: 100.0, //半径),new Positioned(top: 10.0,left: 59.0,child: new Text("hanyajun.com"),),new Positioned(bottom: 10.0,right: 80.0,child: new Text("韩亚军"),),],);return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: stack,),),);}
}
card widget
import 'package:flutter/material.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {var card = new Card(child: Column(children: <Widget>[ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),ListTile(title: Text("湖北省咸宁市咸安区", style: TextStyle(fontWeight: FontWeight.w500)),subtitle: Text("朗月清风:123123123123"),leading: new Icon(Icons.account_box, color: Colors.lightBlue),),],),);return MaterialApp(title: "Column Widget Demo",home: Scaffold(appBar: new AppBar(title: new Text("垂直方向布局"),),body: Center(child: card,),),);}
}
代码中使用了一个垂直布局组件Column组件,然后利用了ListTile实现内部列表,这里需要说明的是ListTile不光可以使用在ListView组件中
flutter-布局学习相关推荐
- Flutter学习第七天 flutter布局
这个转自我自己的有道云 想看图片去那里 文档:Day3_6 flutter布局.md 链接:http://note.youdao.com/noteshare?id=b6399e53df489374f1 ...
- 学习笔记-Flutter 布局(四)- Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth详解...
Flutter 布局(四)- Baseline.FractionallySizedBox.IntrinsicHeight.IntrinsicWidth详解 本文主要介绍Flutter布局中的Basel ...
- 学习笔记-Flutter 布局(二)- Padding、Align、Center详解
Flutter 布局(二)- Padding.Align.Center详解 本文主要介绍Flutter布局中的Padding.Align以及Center控件,详细介绍了其布局行为以及使用场景,并对源码 ...
- Flutter 布局 - UI - 官方文档 - 学习速记(一)
设置crossAxisAlignment属性值为CrossAxisAlignment.start,这会将该列中的子项左对齐. 获取主题色:Theme.of(context).primaryColor; ...
- Flutter 布局控件完结篇
本文对Flutter的29种布局控件进行了总结分类,讲解一些布局上的优化策略,以及面对具体的布局时,如何去选择控件. 1. 系列文章 Flutter 布局详解 Flutter 布局(一)- Conta ...
- 视频教程-Flutter布局实战网易新闻客户端-flutter
Flutter布局实战网易新闻客户端 Flutter书籍作者.曾任职于多家互联网大型企业,担任移动端项目技术负责人,主导研发和攻关技术难题,项目涉及教育.金融.医疗.交通.车载设备.智能家居等众多领域 ...
- 全网最全Flutter的学习文档,不可转载
Flutter学习文档-Author:Brath 由于文章内容较干,请允许Brath打一波广告- 面试记APP Github:https://github.com/Guoqing815/intervi ...
- 【Flutter】Flutter 布局组件 ( 布局组件简介 | Row 组件 | Column 组件 | SizedBox 组件 | ClipOval 组件 )
文章目录 一.Flutter 布局相关的组件简介 二.Row 和 Column 组件 三.SizedBox 组件 四.ClipOval 组件 五. 完整代码示例 六. 相关资源 一.Flutter 布 ...
- flutter布局-8-animated_icons动画图片
示例 github:flutterlayout https://github.com/LiuC520/flutterlayout MaterialApp 连载:flutter布局-1-column 连 ...
- CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化
一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...
最新文章
- VScode 无法创建文件或者无法保存文件
- 【Python进阶】Python进阶专栏、编程与开源框架知识星球上线,等你来follow
- 在windows上模拟linux环境,MSYS2——Windows平台下模拟linux环境的搭建-Go语言中文社区...
- springboot整合redis操作缓存(将查询到的数据放在缓存中)
- 指定应用程序网络连接_总结Java开发Web应用程序应该理解的几个知识点
- 语句include和require的区别是什么?
- 使用ReportNG更好看的TestNG HTML测试报告– Maven指南
- caffe各层参数详解
- java tostring的用处_JAVA的tostring()方法的作用是什么呢?
- 数据库都可以“自动驾驶”了,传统DBA何去何从?
- PHP提示Notice: Undefined variable的解决办法
- PaddleOCR实现车牌识别系统
- 阈值分割法——最佳阈值的选择问题
- vue项目引入阿里巴巴矢量图标库图标
- jrebel使用方法
- CondaUpgradeError: This environment has previously been operated on by a conda version that‘s newer
- word怎么转pdf原格式不变?可以试试这个途径
- 图片批量转换成pdf
- vs+cmake完美编译RTS游戏,类似魔兽争霸源码
- usleep()和sleep()的区别