前言:
而今姐妹们对“css矢量字体图标大小不一样”大约比较关怀,你们都需要知道一些“css矢量字体图标大小不一样”的相关知识。那么小编同时在网上汇集了一些对于“css矢量字体图标大小不一样””的相关内容,希望同学们能喜欢,小伙伴们快快来了解一下吧!一、文本 Widget1、纯文本(Text)
Text 控件常见属性:
textAlign: 文本对齐,默认是左对齐,可以根据实际情况修改为居中(TextAlign.center)或右对齐(TextAlign.right)maxLines: 文字最多显示多少行,通常与 overflow 搭配使用overflow: 内容溢出显示效果,可以设置显示省略号(TextOverflow.ellipsis)textScaleFactor: 缩放因子,默认是 1。style: 文本样式,直接使用 TextStyle():fontSize: 文字大小color: 文字颜色fontWeight: 文字粗细
/// Text的使用Democlass TextWidgetDemo extends StatelessWidget { final textContent = "《定风波》 苏轼 \n莫听穿林打叶声,何妨吟啸且徐行。\n竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。\n"; // final textContent = "《定风波》 苏轼 莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。"; @override Widget build(BuildContext context) { return Text( textContent, // 默认情况下,Text是包裹文字的,文字内容太少时可能看不出效果 textAlign: TextAlign.center, // 文字最多显示2行 maxLines: 3, // 文字超过2行时,显示... overflow: TextOverflow.ellipsis, // 缩放因子,默认是1 textScaleFactor: 1, style: TextStyle( fontSize: 30, color: Colors.red, fontWeight: FontWeight.bold, // 字体加粗 ), ); }}
注意:Text 并不是最终渲染的 Widget,最终渲染的是 RichText。Text 的父类是 StatelessWidget,最终渲染的 Widget 是 build()方法创建出来的 RenderObjectWidget,即 RichText。
2、富文本(Text.rich())
Text.rich() 有一个必须参数 InlineSpan textSpan,InlineSpan 是抽象类且无工厂构造函数,无法直接创建,故需要使用其子类:
TextSpan : 用于构建纯文本的 SpanWidgetSpan : 用于构建内嵌 Widget 的 Span (比如:Icon)
/// Text.rich()的使用Democlass TextRichDemo extends StatelessWidget { @override Widget build(BuildContext context) { return Text.rich( TextSpan( // text: "Hello lqr", // style: TextStyle(color: Colors.red,fontSize: 20), children: [ TextSpan(text: "Hello World", style: TextStyle(color: Colors.red)), TextSpan( text: "Hello Flutter", style: TextStyle(color: Colors.green)), WidgetSpan(child: Icon(Icons.favorite, color: Colors.red)), TextSpan(text: "Hello Dart", style: TextStyle(color: Colors.blue)), ], ), style: TextStyle(fontSize: 26), ); }}二、按钮 Widget1、常见 ButtonRaisedButton : 突出的 Button(从 v1.25.0 过时,推荐使用 ElevatedButton)FlatButton : 扁平的 Button(从 v1.25.0 过时,推荐使用 TextButton)OutlineButton : 边框 Button(从 v1.25.0 过时,推荐使用 OutlinedButton)FloatingActionButton : 浮动按钮,简称 FAB,一般用在 Scaffold 中floatingActionButtonLocation : 可指定 FAB 在界面中的位置,比如底部居中: FloatingActionButtonLocation.centerFloat
在使用这些常见 Widget 时,经常会看到构造方法中有两类 "必传"参数:
必传参数 : 指的是 Dart 语法中方法的必传参数,这种参数不传一定报错(编译不通过)。
required 参数 : 使用 @required(或 required 关键字)修饰的 可选参数,这种不传编译可以通过,但是会报警告。
class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("基础Widget")), body: HomeContent(), // 4. FloatingActionButton floatingActionButton: FloatingActionButton( child: Icon(Icons.add), onPressed: () => print("FloatingActionButton Click"), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, ); }}...class ButtonDemo extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ // 1. 突出的Button(从 v1.25.0 过时,推荐使用 ElevatedButton) RaisedButton( child: Text("RaisedButton"), textColor: Colors.red, // 文字颜色(也可以在Text的style中设置) color: Colors.blue, // 按钮背景色 onPressed: () => print("RaisedButton Click"), ), // 2. 扁平的Button(从 v1.25.0 过时,推荐使用 TextButton) FlatButton( child: Text("FlatButton"), color: Colors.orange, onPressed: () => print("FlatButton Click"), ), // 3. 边框Button(从 v1.25.0 过时,推荐使用 OutlinedButton) OutlineButton( child: Text("OutlineButton"), onPressed: () => print("OutlineButton Click")), // 4. FloatingActionButton,一般用在Scaffold中 // FloatingActionButton(onPressed: onPressed) // 5. 自定义Button:图标-文字-背景-圆角 FlatButton( color: Colors.amberAccent, shape: RoundedRectangleBorder( // 圆角 borderRadius: BorderRadius.circular(8), ), child: Row( mainAxisSize: MainAxisSize.min, // 默认是max,占满父Widget;min是包裹内容 children: [ Icon(Icons.favorite, color: Colors.red), // 图标 Text("喜欢作者"), // 文字 ], ), onPressed: () => print("自定义Button"), // onPressed必传,否则样式可能会出问题 ) ], ); }}2、定制 Button默认间隔 : 默认情况下 Button 上下有一定有间隔,可以指定 materialTapTargetSize 来修改MaterialTapTargetSize.padded:(默认值) 当按钮宽(或高)不足 48px 时,就把宽(或高)扩展到 48pxMaterialTapTargetSize.shrinkWrap:紧缩包裹,可以去除上下的间隔最小宽度 : ButtonTheme(也是个 Widget,包裹 Button) 或 minWidth(Button 的一个属性)内间距 : 修改 padding 属性值
class ButtonExtensionDemo extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ /// 1. 默认情况下Button上下有一定有间隔 /// MaterialTapTargetSize.padded:当按钮宽(或高)不足48px时,就把宽(或高)扩展到48px。 /// MaterialTapTargetSize.shrinkWrap:紧缩包裹,可以去除上下的间隔。 FlatButton( color: Colors.red, child: Text("Flat Button1"), textColor: Colors.white, onPressed: () {}, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), FlatButton( color: Colors.red, child: Text("Flat Button2"), textColor: Colors.white, onPressed: () {}, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), /// 2. 修改按钮的最小宽度:ButtonTheme FlatButton( minWidth: 30, height: 30, color: Colors.red, child: Text(""), onPressed: () {}, ), ButtonTheme( minWidth: 30, height: 30, child: FlatButton( color: Colors.red, child: Text(""), onPressed: () {}, ), ), /// 3. 修改按钮的内间距 FlatButton( padding: EdgeInsets.all(0), // 只能去除左右内间距,上下内间距可以指定一个固定height解决 color: Colors.red, child: Text("Float Button3"), textColor: Colors.white, onPressed: () {}, ), ], ); }}三、图片 Widget
Image 控件需要一个必传参数 ImageProvider image,常见子类如下:
NetworkImage : 用于加载网络图片简单写法 : Image.network(';)AssetImage : 用于加载 app 包内图片简单写法 : Image.asset('assets/images/FSA_QR.png')1、NetworkImage常见属性:Alignment.bottomCenter : 底部居中Alignment.center : 居中Alignment(x, y) : 左上角是(-1, -1),右下角是(1, 1)BoxFit.fill : 拉伸BoxFit.contain : 内容缩放至最长的一边贴边BoxFit.cover : 内容缩放至最短的一边贴边BoxFit.fitWidth : 宽度一定,高度自适应BoxFit.fitHeight : 高度一定,宽度自适应fit : 图片填充方式alignment :color : color 不是背景色,而是用于图像混入的颜色,配合 colorBlendMode 使用repeat : 重复模式,比如纵向重复 ImageRepeat.repeatY
class ImageDemo01 extends StatelessWidget { @override Widget build(BuildContext context) { return GridView.count( crossAxisSpacing: 8, mainAxisSpacing: 8, crossAxisCount: 3, children: [ wrapItem( Image(image: NetworkImage(imageUrl)), "NetworkImage", ), wrapItem( Image.network(imageUrl), "Image.network()", ), Container(), wrapItem( Image.network(imageUrl, fit: BoxFit.fill), // 拉伸 "BoxFit.fill", ), wrapItem( Image.network(imageUrl, fit: BoxFit.contain), // 内容缩放至最长的一边贴边 "BoxFit.contain", ), wrapItem( Image.network(imageUrl, fit: BoxFit.cover), // 内容缩放至最短的一边贴边 "BoxFit.cover", ), wrapItem( Image.network(imageUrl, fit: BoxFit.fitWidth), // 宽度一定,高度自适应 "BoxFit.fitWidth", ), wrapItem( Image.network(imageUrl, fit: BoxFit.fitHeight), //高度一定,宽度自适应 "BoxFit.fitHeight", ), Container(), wrapItem( Image.network(imageUrl, alignment: Alignment.bottomCenter), "Alignment.topLeft", ), wrapItem( Image.network(imageUrl, alignment: Alignment.center), "Alignment.center", ), wrapItem( // 左上角是(-1, -1),右下角是(1, 1) Image.network(imageUrl, alignment: Alignment(0, -1)), "Alignment(0, -1)", ), wrapItem( // color不是背景色,而是用于图像混入的颜色,配合 colorBlendMode 使用 Image.network(imageUrl, color: Colors.green, colorBlendMode: BlendMode.colorDodge), "BlendMode.colorDodge", ), wrapItem( Image.network(imageUrl, repeat: ImageRepeat.repeatY), "ImageRepeat.repeatY", ), ], ); } Widget wrapItem(Widget widget, String tip) { Text genTip(String tip) { return Text( tip, style: TextStyle( fontSize: 14, color: Colors.white, backgroundColor: Colors.black, ), ); } return Stack( fit: StackFit.expand, children: [ Container(color: Colors.red[100], child: widget), Positioned(left: 4, bottom: 4, child: genTip(tip)), ], ); }}2、AssetImage
使用 AssetImage 加载包内图片步骤如下:
在 Flutter 项目中创建一个文件夹目录(比如 assets/image),存储图片在 pubspec.yaml 进行配置
assets: # - assets/images/FSA_QR.png # 配置单张图片 - assets/images/ # 配置多张图片使用图片
class ImageDemo02 extends StatelessWidget { @override Widget build(BuildContext context) { // 简单写法 // Image.asset('assets/images/FSA_QR.png'); return Image( image: AssetImage('assets/images/FSA_QR.png'), ); }}3、占位图(placeHolder)
在网络图片未加载出来之前显示的图片称为占位图,可以使用 FadeInImage 实现占位图功能:
class ImageExtensionDemo extends StatelessWidget { final imageUrl = ";; @override Widget build(BuildContext context) { return FadeInImage( fadeInDuration: Duration(milliseconds: 1), fadeOutDuration: Duration(milliseconds: 1), placeholder: AssetImage("assets/images/FSA_QR.png"), image: NetworkImage(imageUrl), ); }}
Flutter 会自动进行图片缓存(默认最多缓存 1000 张,缓存空间最多 100m)
四、字体图标 Widget
Icon 字体图标和图片图标对比:
字体图标是矢量图(放大的时候不会失真)字体图标可以设置颜色图标很多时,字体图标占据空间更小
Icon 控件接收一个必传参数 IconData icon,Icons 中配备了大量常用 icon (如 Icons.pets),可以使用 Icons.xxx 或 IconData(编码,字体) 这 2 种方式来得到 IconData 对象。另外,IconData 的本质就是字体,因此也可以使用 Text 来显示字体图标:
class IconDemo extends StatelessWidget { @override Widget build(BuildContext context) { // return Icon(Icons.pets, size: 300, color: Colors.orange); // return Icon(IconData(0xe90e, fontFamily: 'MaterialIcons'),size: 300,color: Colors.orange); /// 1. 使用Text显示字体图标时,需要将字体编码 -> unicode编码 /// 2. 设置对应的字体fontFamily // return Text("0xe90e", style: TextStyle(fontSize: 100, color: Colors.orange)); return Text( "\ue90e", style: TextStyle( fontSize: 100, color: Colors.orange, fontFamily: 'MaterialIcons', ), ); }}五、表单 Widget1、TextField 配置decoration : 用于自定义输入框样式,InputDecoration():labelText : 输入框上的 label 文字icon : 输入框左侧的 iconhintText : 输入框中的提示文字border : 边框,通常使用 OutlineInputBorder()filled : 是否使用填充色,默认为 falsefillColor : 填充色(可以理解为输入框的背景色)obscureText : 是否模糊文字,默认为 false,密文模式设置设置为 trueonChanged : 监听文字内容变化onSubmitted : 监听提交事件
class TextFieldDemo1 extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ TextField(), TextField( decoration: InputDecoration( labelText: 'username(labelText)', icon: Icon(Icons.people), hintText: '请输入用户名(hintText)', ), ), TextField( decoration: InputDecoration( hintText: '请输入用户名(hintText)', ), ), SizedBox(height: 10), TextField( decoration: InputDecoration( labelText: 'OutlineInputBorder', icon: Icon(Icons.people), border: OutlineInputBorder(), ), ), TextField( decoration: InputDecoration( labelText: 'fillColor', icon: Icon(Icons.people), border: OutlineInputBorder(), filled: true, fillColor: Colors.red[100], ), ), TextField( decoration: InputDecoration(hintText: '监听事件'), onChanged: (value) => print("onChange:$value"), // 监听文字内容变化 onSubmitted: (value) => print("onSubmitted:$value"), // 监听提交事件 ), TextField( obscureText: true, // 模糊文本 decoration: InputDecoration( labelText: 'password', icon: Icon(Icons.lock), border: OutlineInputBorder(), ), ) ], ); }}2、TextField 内容获取
Flutter 是声明式 UI,也没有提供 ref 之类的方式去获取到 TextField 控件,因此无法通过 TextField 对象来获取输入框中的内容,不过,可以为 TextField 指定 controller,通过 controller 来获取对应输入框中的内容:
题外话:Vue 和 React 可以为控件指定 ref 值,用于在 js 或 jsx 中来获取到控件。
class TextFieldDemo2 extends StatelessWidget { final usernameTextEditController = TextEditingController(); final passwordTextEditController = TextEditingController(); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(8.0), child: Column( children: [ TextField( controller: usernameTextEditController, decoration: InputDecoration( labelText: 'username', icon: Icon(Icons.people), hintText: '请输入用户名', border: OutlineInputBorder(), ), ), SizedBox(height: 8), TextField( controller: passwordTextEditController, obscureText: true, decoration: InputDecoration( labelText: 'password', hintText: '请输入密码', icon: Icon(Icons.lock), border: OutlineInputBorder(), ), ), SizedBox(height: 8), Container( // width: 300, width: double.infinity, height: 40, child: FlatButton( color: Colors.blue, textColor: Colors.white, child: Text("登录"), onPressed: () { // 1. 获取用户名和密码 final username = usernameTextEditController.text; final password = passwordTextEditController.text; print("账号:$username , 密码:$password"); }, ), ), ], ), ); }}
标签: #css矢量字体图标大小不一样