敞开成长之旅!这是我参加「日新方案 12 月更文应战」的第21天,点击查看活动概况
本系列教程基于Flutter widget, 意在为Flutter 入门提供基础建设. 重点在解说widget 的 用法,参数以及扩展.
适宜人群: 入门
引言
AspectRatio 能够依据具体的长宽比束缚 child 的布局规模, 从而影响 child 的大小. 通常在视频、图像中会常常使用, 今天咱们来分析一下它的实现原理.
AspectRatio
AspectRatio 的参数只有 key、aspectRatio、child. 它会依据 aspectRatio 去重核算束缚 child 的布局规模. 咱们举一个比如:
Center(
child: AspectRatio(
aspectRatio: 1.0,
child: Image.network('xx'),
),
)
以图片长宽比3:2为比如
-
当 aspectRatio 为1.0时:
由于图片的份额大于 1.0, aspectRatio 取 1.0 时, 以屏宽为基准, 1:1为份额, 构建了一个正方形的布局束缚规模. 当图片比大于 1.0 时, 图片以屏宽为图片宽, 而图片高要小于束缚高. 因而实践布局中, 图片在束缚中心. -
当 aspectRatio 为0.2时:
由于图片的份额大于 1.0, aspectRatio 取 0.2 时, 屏幕宽高大于0.2. 以屏高为基准, 1:5为份额, 构建了一个矩形的布局束缚规模. 当图片比大于 1.0 时, 图片以屏幕高的1/5为图片宽. 因而实践布局中, 图片会比正常小. -
当 aspectRatio 为5.0时:
由于图片的份额大于 1.0, aspectRatio 取 5.0 时, 屏幕宽高小于5.0. 以屏宽为基准, 5:1为份额, 构建了一个矩形的布局束缚规模. 当图片比大于 1.0 时, 图片以屏幕高为图片的高. 因而实践布局中, 图片会比正常小.
这一系列的原因都来自于内部的算法, 让咱们一起进入源码中学习一下~
RenderAspectRatio
RenderAspectRatio 是 AspectRatio 的 RenderObject . 里边也封装了关于布局的核算规则, AspectRatio 的核算核心在于 _applyAspectRatio.
constraints.isTight
假如尺度刚刚好合适的话, 会返回满足束缚的最小大小
非constraints.isTight
这种情况下, width 会具有默认赋值. 首先会等于束缚的最大宽度. 假如宽度是有限的, 那么高度会依据 _aspectRatio 赋值. 反之, 高度会取束缚限制的最大高, 同时将宽依据高度重赋值.在赋值完基础度宽高后, 会经过四个判别获取最后的尺度.
四个判别如下:
- width > constraints.maxWidth
当宽度大于束缚最大宽时, 会从头把宽赋值为束缚的最大宽, 偏重核算高 - height > constraints.maxHeight
当高度大于束缚最大高时, 会从头把高赋值为束缚的最大高, 偏重核算宽 - width < constraints.minWidth
当宽小于束缚的最小值时, 会把宽赋值为束缚度最小值, 偏重核算高 - height < constraints.minHeight
当高小于束缚的最小值时, 会把高赋值为束缚度最小值, 偏重核算宽
在经过这一系列核算后, 宽高将会依据 aspectRatio 重核算直至符合 aspectRatio 并且能放进束缚中.
结语
这里是WeninerIo
假如你对这次的技术共享感兴趣或者有什么疑问
不妨在评论区留言或私信
或许这次的共享不是你所等待的
那就点个关注吧! ❤️
下次也许就是你想看的呢?