简介

我们在构建UI的时候,为了适应不同的屏幕大小,通常需要进行一些自适应的配置,而最常见的自适应就是根据某个宽度或者高度自动进行组件的缩放。

今天要给大家介绍两个可以自动缩放的组件AspectRatio和FractionallySizedBox。

AspectRatio

AspectRatio的目的就是将其child按比例缩放。

先来看下AspectRatio的定义:

class AspectRatio extends SingleChildRenderObjectWidget

可以看到AspectRatio继承自SingleChildRenderObjectWidget,表示用来呈现一个single child。

AspectRatio需要的属性有两个,分别是aspectRatio和子元素child。

aspectRatio是一个double类型的数据,为了方便起见,我们一般使用比例的格式来进行表示,比如3.0/2.0等。

虽然我们知道3/2的结果是1.5,但是我们最好不要自行计算结果,因为使用3.0/2.0更加直观。

AspectRatio的逻辑是首先获得最大的width或者height,然后根据width或者height来计算height和width。接下来我们来看几个具体的例子,来详细了解AspectRatio。

首先是一个无限宽度但是高度为150的container,然后再container的child中使用了AspectRatio组件,如下所示:

  Widget build(BuildContext context) {
return Container(
color: Colors.blue,
alignment: Alignment.center,
width: double.infinity,
height: 150.0,
child: AspectRatio(
aspectRatio: 3 / 2,
child: Container(
color: Colors.red,
),
),
);

这里的aspectRatio=3/2, 那么怎么来计算aspectRatio的大小呢?

对于aspectRatio的父widget来说,他的宽度是无限的,他的高度是150,所以aspectRatio的高度是可以确定的,也就是150,我们根据aspectRatio的比例,计算出它的width=150/2 * 3 = 225, 如下所示:

再看下面的一个例子:

  Widget build(BuildContext context) {
return Container(
color: Colors.blue,
alignment: Alignment.center,
width: 150.0,
height: 150.0,
child: AspectRatio(
aspectRatio: 2.0,
child: Container(
color: Colors.red,
),
),
);
}

这个例子中Container的width和height是相等的。

在它的child中使用的aspectRatio=2.0。如果child的height选择=150,那么对应的width就应该是300,很明显超出了Container的范围,所以这里选择的是width=150, 而对应的height=75, 入下图所示:

那么问题来了, 如果AspectRatio指定了大小应该怎么处理呢?

比如我们给aspectRatio的child添加一个width和height限制:

  Widget build(BuildContext context) {
return Container(
color: Colors.blue,
alignment: Alignment.center,
width: 150.0,
height: 150.0,
child: AspectRatio(
aspectRatio: 2.0,
child: Container(
color: Colors.red,
width: 50,
height: 50,
),
),
);
}

你会发现这个width和height对Container的大小是没有效果的。

这里就要谈到之前我们提到的constraints了,对于AspectRatio来说,他希望子child填充满它的空间,所以child会继承这个constraints,从而展示相同的界面。

FractionallySizedBox

FractionallySizedBox和AspectRatio有些类似,不过FractionallySizedBox是按照可用空间的大小来进行比例设置的。

首先来看下FractionallySizedBox的定义:

class FractionallySizedBox extends SingleChildRenderObjectWidget

可以看到FractionallySizedBox和AspectRatio一样继承自SingleChildRenderObjectWidget。

FractionallySizedBox有三个属性,分别是alignment,widthFactor和heightFactor。

其中alignment表示的是FractionallySizedBox中子child的排列方式。

而widthFactor和heightFactor是double类型的,表示的是对应的缩放比例。

接下来,我们看一下FractionallySizedBox的具体使用。

  Widget build(BuildContext context) {

    return FractionallySizedBox(
widthFactor: 1,
heightFactor: 0.25,
alignment: FractionalOffset.center,
child: DecoratedBox(
decoration: BoxDecoration(
border: Border.all(
color: Colors.red,
width: 4,
),
),
),
);
}

这里我们设置对应的widthFactor=1和heightFactor=0.25, 也就是说widht和可用空间的width是一致的,而height只有原来的1/4。

为了方便起见,我们将child用一个DecoratedBox封装起来,用来展示box的边界,最后得到的界面如下所示:

总结

熟练使用AspectRatio和FractionallySizedBox可以很方便的按比例来绘制界面的元素,非常好用。

本文的例子:https://github.com/ddean2009/learn-flutter.git

更多内容请参考 www.flydean.com

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

flutter系列之:按比例缩放的AspectRatio和FractionallySizedBox的更多相关文章

  1. flutter系列之:UI layout简介

    目录 简介 flutter中layout的分类 常用layout举例 总结 简介 对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了.布局的英文名叫做layout,就是用来 ...

  2. Android 使用Picasso加载网络图片等比例缩放

    在做android图片加载的时候,由于手机屏幕受限,很多大图加载过来的时候,我们要求等比例缩放,比如按照固定的宽度,等比例缩放高度,使得图片的尺寸比例得到相应的缩放,但图片没有变形.显然按照andro ...

  3. 《你不知道的 CSS》之等比例缩放的盒子

    你肯定已经知道,对于一个 img 元素而言,你可以单独地修改它的 width 或者 height 属性来设置它的大小,同时图片的比例还能够保持不变. 如下图所示,最上面是原始大小的图片,下面两张则分别 ...

  4. C#图片按比例缩放

    C#图片按比例缩放: // 按比例缩放图片 public Image ZoomPicture(Image SourceImage, int TargetWidth, int TargetHeight) ...

  5. html img图片等比例缩放

    在img标签里面只设置宽,不设置高,图片就会等比例缩放.

  6. Java控制图片按比例缩放- (注意内存释放)

    package mytiny.com.common; import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;im ...

  7. 理解CSS3中的background-size(对响应性图片等比例缩放)

    理解CSS3中的background-size(对响应性图片等比例缩放) 阅读目录 background-size的基本属性 给图片设置固定的宽度和高度的 固定宽度400px和高度200px-使用ba ...

  8. jQuery实现等比例缩放大图片

      在布局页面时,有时会遇到大图片将页面容器“撑破”的情况,尤其是加载外链图片(通常是通过采集的外站的图片).那么本文将为您讲述使用jQuery如何按比例缩放大图片,让大图片自适应页面布局. 通常我们 ...

  9. [原创]C#按比例缩放窗体控件及字体

    按照比例缩放窗体控件及字体,如需等比例缩放,只需将x,y的比例设置成相同即可. 为了减小误差,建议使用原始尺寸来计算比例. private float X, Y; private bool b = f ...

  10. CSS实现图片快速等比例缩放,效果佳

    初学者在实现图片等比例缩放,通常会使用js编写逻辑来控制高或宽,达到自动缩放的效果. 这里提供一种纯CSS的图片缩放功能,请看代码: <style type="text/css&quo ...

随机推荐

  1. Hdf5开发笔记(一):hdf5介绍,在windows上编译msvc2015x64版本

    前言   matlab的matio库需要使用到hdf5,编译hdf5的msvc2015x64版本. HDF5介绍   HDF(Hierarchical Data Format)是一种设计用于存储和组织 ...

  2. 【华为机试ACM基础#02】从单向链表中删除指定值的节点、输出单向链表中倒数第k个节点(熟悉链表的输入方式)

    从单向链表中删除指定值的节点 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针. 链表的值不能重复. 构造过程,例如输入一行数据为: 6 2 1 2 ...

  3. 【Azure 云服务】Azure Cloud Service 关于虚拟机资源,杀毒软件配置,补丁机制的问答

    一:云服务后端是2台虚拟机,Work Role,Web Role,可以RDP进去,但是为什么在虚拟机列表里看不到呢? 因为云服务(经典)是PaaS服务,有别于传统的IaaS服务,其提供的WebRole ...

  4. linux的内置crontab(定时任务)的简单介绍

    编写定时任务的基本命令: #查看当前用户的crontab crontab -l:   #编辑crontab任务 crontab -e:   #删除crontab任务 crontab -r   定时任务 ...

  5. vue开发过程常用的JSX语法

    参考资料:https://juejin.cn/post/7114063575122984973 在Vue项目的开发过程,经常会使用到JSX语法,对常用的JSX语法分类做个笔记,方便需要之时查阅 动态绑 ...

  6. XAF Blazor FilterPanel 布局样式

    从上一篇关于ListView布局样式的文章中,我们知道XAFBlazor是移动优先的,如果想在PC端有更好的用户体验,我们需要对布局样式进行修改.这篇介绍在之前文章中提到的FilterPanel,它的 ...

  7. vscode 自定义 当前行转大写快捷键 alt + shift + U

    vscode 自定义 当前行转大写快捷键 alt + shift + U

  8. 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \

    为什么 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \ 快速移动到下一个 注意有时候输入法会有问题 因为 Ctrl + Shift 是切换输入法,所以回头 ...

  9. 视野修炼第71期 | Rspack 家族新成员 Rsdoctor

    欢迎来到第 71 期的[视野修炼 - 技术周刊],下面是本期的精选内容简 强烈推荐 Rspack 新成员:Rsdoctor Bun Shell DCloud:App跨平台框架对比2023版 开源工具& ...

  10. 基于C#的自动校时器 - 开源研究系列文章

    上次在公司的Windows7电脑上操作系统没有自动进行校时,导致系统时间老是快那么几分钟,于是想到了用C#开发一个系统时间自动校时器.这个应用不难,主要是能够校时那个操作类的问题. 1. 项目目录: ...