flutter比例,flutter 比较
2020-05-15 flutter BoxConstraints and layout
在出现布局错误时能尽快找到错误原因。
创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、成都做网站、广饶网络推广、重庆小程序开发、广饶网络营销、广饶企业策划、广饶品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供广饶建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
以下是对关键内容的翻译和注解。
flutter的布局模型是“一步布局模型”(one-pass layout model),在渲染树中,向下treewalk传递给子 盒约束,然后再向上treewalk将计算好的几何形状(比如高度、宽度等)传递给父。我理解one-pass layout model就是一遍就将布局计算好。不会多次treewalk去计算布局,或多次重绘(repaint)并多次计算布局。
计算的好的几何形状必须符合盒约束的要求。
盒约束有四个值,minWidth,maxWidth,minHeight,maxHeight,符合盒约束的意思就是说 计算出的宽高必须在最大值和最小值之间 。
我猜测,在将盒约束向子传递的过程中,子会根据父的盒约束,设置自己的盒约束,而不是单纯的继承父的盒约束。稍后结合Flex布局可以解释。
盒约束的最小值和最大值相等。因此在tight约束下的子的高宽将等于父的高宽,也就是说子是紧紧(tight)贴着父的。
盒约束的最小值为0,也就是说子可以是小于盒约束最大值的任何值,也就是说子是不紧贴(松的,loose)父的。
盒约束的最大值不是infinite(无穷大)
盒约束的最大值是infinite(无穷大)
盒约束的最小值是infinite(无穷大),他的子的宽或高只能取无穷大。
子的宽高(Size)符合盒约束的要求。
以下摘抄原文档并翻译,并加以分析。为了关注要点, 忽略crossAxis方向(水平方向)的处理 。
以下图为Column布局实例。
给column布局进行了以下6步操作
首先给每个非flex子元素,设置竖直方向unbounded(无界)的盒约束。结合图片,也就是将1、2两个子设置好竖直方向无界的盒约束。示例中1和2设置了高度,因此一共占用高度是5+3=8.
按flex的比例给flex元素分配剩余的空间。因为示例只有一个flex元素,即3号元素,因此将占有剩余全部空间,高度是20-5-3 = 12。
在第二步中分配好空间的flex元素,给他设置的盒约束不是竖直方向unbounded(给非flex元素设置的是竖直方向unbounded),而是有界的盒约束,盒约束的maxHeight是12,即第二步中被分配的高度。
水平方向不解释了。高度设置完了他去设置宽度。
Column组件的总高度是由mainAxisSize属性决定的,如果值是MainAxisSize.max,Column的高度就是Column的盒约束的maxHeight值,示例中我们给Column设置了高度为20的bounded盒约束,假设Column.mainAxisSize=MainAxisSize.max,那么Column的高度就是20.如果mainAxisSize=MainAxisSize.min,Column的高度将由其子元素的高度和决定。假设3号flex元素不设置成flex元素,而是固定高度为8,那么Column的高度就是5+3+8=16.
设置子元素的位置,即设置靠左,靠右,居中,分散等,与本示例关系不大。
根据第一步,inner column被outer column设置了无界(unbounded)的盒约束,Column会紧包children,而inner column的Expanded要撑开以占用inner column的剩余空间,这就冲突了。
解决方案:给inner column设置有界的盒约束即可。比如给inner column外包一层有高度的Container。
下面这种方案,给inner column包一层Expanded也可以,是因为在outer column中,Expanded会被设置成有界的盒约束(结合第三步),因此Expanded就可以向外扩展(expand)了。
Flutter 屏幕适配 -- 百分比
本文是根据 Daniele Cambi 的文章 Flutter — Effectively scale UI according to different screen sizes 总结而来 :
文章地址 : (自备扶梯)
本文核心思想 :
作者创建一个矩形 :
在iPhone 5s (4" Display) and on an iPhone XS Max (6,46" Display),
显示效果的差异 !!! 如何解决这个问题呢 ?
注: Flutter 使用的 逻辑像素 logical pixels 为单位 ,和 Android的 dp还是不一样
具体 lp 有什么效果,网上也没查到具体资料????
如何解决这个问题呢 ?
作者认为可以把屏幕认为是一个 , 100 * 100 的格子(或者认为水平方向和竖直方向,平均分成100个单位 ,恩 ,是不是就是Android中的百分比布局了)
作者新建一个帮助类 :
初始化方法 :
使用帮助类来设置widget大小 :
效果图 :
在Flutter中有一个非常方便的小部件,可以有效地处理这些问题,它被称为“安全区域”( SafeArea)。
个人理解,flutter , 把 异形屏 ,导航栏相关区域称为 安全区域 。
作者的思想 :屏幕的长宽去掉安全区域的大小,然后分成 100份 ,算出每一块的单位长度 。
我们可以使用 SizeConfig.safeBlockHorizontal or SizeConfig.safeBlockVertical为单位 ,对文字进行缩放 。
真实的软件开发过程,一般是设计人员先设计好设计图 or 设计稿(一般是1080px * 1920px为基准),然后研发人员进行开发
那我们就把屏幕宽和长 ,分成 1080 和 1920 个单位 ,然后按设计图上的标注去填写相应widgets的大小
所以我认为 flutter 非常适合百分比布局(天生适合按比例布局)
而Android 百分比布局,适配工作量非常大,兼容性差
在网上发现了一个开源库 ,原理我觉得差不多,大家可以学习一下
flutter_screenutil
如果觉得文章有用,帮忙点个喜欢❤️ ,????????????
Flutter 之 弹性布局 (Row、Column) (十一)
弹性布局允许子组件按照一定比例来分配父容器空间
Flex组件和Row、Column属性主要的区别就是多一个direction。
当direction的值为Axis.horizontal的时候,则是Row。
当direction的值为Axis.vertical的时候,则是Column。
它们之中都有主轴(MainAxis)和交叉轴(CrossAxis)的概念:
Row可以沿水平方向排列其子widget。定义如下:
示例1 - 基本使用
示例2 - 基线对齐
基线是英文字母X的下端两点连成的一条线
示例3 - 水平方向包裹
Column可以沿垂直方向排列其子widget。定义如下:
Column 基本使用 示例
再看一个示例
运行效果如下:
我们发现文本并没有居中?
解释:
实际上,Row和Column都只会在主轴方向占用尽可能大的空间,而交叉轴的长度则取决于他们最大子元素的长度。如果我们想让本例中的两个文本控件在整个手机屏幕中间对齐,我们有两种方法:
运行效果如下:
如果Row里面嵌套Row,或者Column里面再嵌套Column,那么只有最外面的Row或Column会占用尽可能大的空间,里面Row或Column所占用的空间为实际大小,下面以Column为例说明
如果要让里面的Column占满外部Column,可以使用Expanded 组件:
Flutter开发--视频播放器
目前Flutter平台主流的两个播放器是video_player和fijkplayer
pub
github
1、Flutter平台官方插件,作者是国外的,有问题沟通比较困难,只能通过提交issue
2、硬解码
4、UI封装: better_player
基于video_player和Chewie的高级视频播放器。它解决了许多典型的用例,并且易于运行。
5、播放器宽高比例与视频内容宽高比例不一致时,会出现图像压缩变形的问题
6、调用原生内核播放器:iOS--AVPlayer, Android--ExoPlayer
7、对于分段源 m3u8 的播放不友好,如果一个切片播放超时,会导致整个播放都失败
8、better_player可以缓存视频,但不能自定义缓存的地址,只能指定key,和缓存的最大内存量(还未研究超出最大的话是不能缓存新的,还是删除最旧的)
9、better_player不能完全自定义UI,只能修改类中的一些开放属性,比如说icon图标,文字颜色啥的
10、无网络有缓存时,封面可以正常展示
11、better_player播放失败有手动retry的设计
pub
github
1、fijkplayer 是一个 Flutter 生态的媒体播放器,是对 ijkplayer 的 Flutter 封装,支持 Android 和 iOS。 fijkplayer 使用 ijkplayer 作为播放器内核,ijkplayer 使用 ffmpeg 进行音视频解封装和解码,同时添加了 Android 和 iOS 平台特有的硬件加速解码能力。
2 、国内有QQ群,但是活跃度也是不高。
3、可以缓存视频,可以自定义缓存的地址,方便后续的内存维护。
4、可以通过FijkPanelWidgetBuilder较大程度上自定义UI。
5、无网络有缓存视频时,无法展示封面,因为内部是通过imageProvider去加载网络图片的。
7、播放失败无手动retry的设计
1、两种播放器都是通过外接纹理方案 (Texture),将播放器视频画面渲染接入 flutter 中,性能上优于 PlatformView 的接入方法。
如何自己实现?
下面以video_palyer的iOS源码部分解释:
iOS用CVPixelBufferRef将渲染出来的数据存在内存中,Flutter engine会将Texture的数据在内存中直接进行映射无需通过Channel传输,然后Texture Widget就可以把你提供的这些数据显示出来。在我们传输数据的时候会需要将其与 TextureID 绑定,绑定的过程通过BasicMessageChannel实现数据流的传输,以做到实时展示的效果
flutter 图片压缩
原以为很难的东西,东找找西找找,只有一个鲁班压缩,但都不怎么维护状态最终找到好的办法,可以通过multi_image_picker库的二进制压缩
80就是压缩比例,默认为100
Assets为获取到的图片类型
上传的时候可以通过
multiImages就是存放Assets类型的图片数组,然后通过for循环遍历来批量添加图片
用dio批量上传
Flutter实践--屏幕适配
做移动端开发的小伙伴都知道,针对不同型号和尺寸的手机要进行页面适配,且Android和iOS适配方案各不相同,那flutter端如何进行适配呢?以下为近期flutter开发过程中关于适配的一些学习和记录~~~~
说到flutter屏幕适配,就不得不提到插件 flutter_screenutil ,提到flutter_screenutil就不得不说以下几点????
默认宽1080px
默认高1920px
allowFontScaling为false,即不跟随系统字体大小设置变化
初始化单位为px
需要把context传进去,因为内部是通过 MediaQuery 来获取屏幕尺寸等相关信息的
无需再传context,因为内部是通过单例 window 来获取屏幕尺寸等相关信息的
作为iOS开发,之前都是以pt为参照进行比例适配的,且架构组已经定义了一套适配相关常量,传px进去不太方便,所以需要对flutter_screenutil进行扩展
公司设计图是以iPhone X的尺寸提供的即物理设备尺寸为375x812,像素比例为750x1624,像素密度比为2
初始化仍用px来初始化
dart sdk 2.7正式支持 extension-method ,即为已有类扩展方法,从 flutter_screenutil 这种 540.w 写法点进去,我们可以看到
flutter_screenutil为num类扩展了一系列简写方法,那我们当然可以按照它这种方式进行扩展
网上提供的解决方案:
第一步:修改 pubspec.yaml
第二步:执行 flutter pub get
第三步:重启 AndroidStudio
解决方案:去掉const即可
UI设计中px、pt、ppi、dpi、dp、sp之间的关系
Dart/Flutter - 扩展方法(ExtensionMethod)
当前题目:flutter比例,flutter 比较
本文地址:http://hbruida.cn/article/dsepoih.html