lex的Layout机制具体的说就是Flex对组件的大小和位置的控制算法。从Flash开始初学Flex,也许会对Flex中设置组件的大小有些不适
应。在Flash中,DisplayObject的width和height会根据DisplayObject所包含的“可视化元素”的大小自动调整,例
如mc中的children的移动或者缩放都可能引起mc的width和height变化,而如果直接改变mc的width和height,会使mc内的
可视化元素放大或缩小(但不会引起可视化元素重组),mc的scaleX和scaleY也同时改变。在Flex中,组件的width和height已经被
override,因此其表现和Flash有所不同:Flex中组建width和height不一定根据可视化元素大小而定,例如设置了精确大小的
Container,即使其内部的可视化元素超出了Container的范围,Container的大小仍然是指定的精确值,同样的设置Flex控件的
width和height时,不是对控件可视化元素的缩放,通常都会引起可视化元素重画成新的大小,而不引起scaleX和scaleY的变化。
以
前从来没想过override能有那么大的“威力”,所以被Flex的width和height搞的糊里糊涂的,呵呵看来菜鸟就是菜鸟,还好随着不断的学
习总算逐渐更领会到OOP的概念和Flash与Flex这些差别。发了点小感慨作为开场白,接下来就说说初学Flex的Layout机制的一些收获吧。
设
置Flex组件的大小的方式有三种:精确大小explicit sizing、默认大小default sizing、百分比大小percent
sizing。精确大小是指通过ActionScript或者MXML明确设置了组件的width或height为多少像素,是一个精确值;默认大小指的
是没有通过ActionScript或者MXML设置组件的width或height;百分比大小是指通过ActionScript设置了组件的
percentWidth或percentHeight,也可以通过MXML设置组件的width或height为一个百分数。
Flex组件大小有以下几种:
- 实际大小:也就是最终显示出来的组件的大小,可以通过width和height指定和获得;
- 精确大小:也就是通过精确大小的方式设置组件大小时,所指定的值,可以通过explicitWidth和explicitHeight获得;
- 默认大小:也就是Flex自动计算出的组件大小,可以通过measuredWidth和measuredHeight获得,如果设置组件的大小为默认大小时,那么组件的默认大小也就是实际大小;
- 百分比大小:也就是通过百分比大小的方式设置组件大小时,所指定的值,可以通过percentWidth和percentHeigh指定和t获得;
- 组件大小的范围:也就是限制组件的大小应该处于某个区间内,可以通过minWidth、maxWidth、minHeight和maxHeight指定和获得这个区间。
知
道了Flex组件大小的设置方式合类型之后,再了解一下Flex的Layout流程。Layout流程分为三步,第一步是刷新组件的属性,称为
Commitment
Pass。第二步是在组件属性更新后,从DisplayList中最深层的组件开始,计算每个组件的测量大小,即查看控件使用的是精确大小还是默认大小,
并获取相应的值,这一步称为Measurement
Pass。第三步是从DisplayList中的最外层也就是Application开始向内计算每个组件的实际的大小,并完成对控件的大小和位置设置,
同时也触发控件的重画等方法,这个过程叫做Layout Pass。
这么多和大小相关的东西,相对Flash确实复杂多了,但是有了这些东西,才让Flex的Layout相对Flash更自动化。在实际使用时,不同的大小设置方式如何产生影响?这就需要更具体概述一下了。
- 采用精确大小的方式设定组件大小
当用户明确指定了组件的width和height的像素值时,布局时Flex就会强制使用用户指定的像素值,注意这种设置是强制的,Flex会保证组件的
实际大小width和height就等于设定值,并且指定的大小不受组件大小的范围限制。在用户通过width和height设置精确大小时,同时也就设
定了组件的explicitWidth和explicitHeight。
- 采用默认大小的方式设定组件大小
当用户不设置组件width和height,也不设置组件的percentWidth和percentHeigth时,布局时就自动计算组件的大小,也就
是使用组件的默认值作为组件的实际大小。不同组件有不同的默认值,组件的默认值也会因为某些属性改变而改变,例如Button的默认值就与button的
label字符长度有关,并且组件的默认大小一定会在[minWidth,maxWidth]和[minHeight,maxHeight]之间,但不一
定就是这个区间内的最小值。
- 采用百分比大小方式设定组件大小
当用户使用百分比的方式指定了组件的大小时,布局时将使用空间的百分比大小。组件的百分比大小是建议性的,Flex只是尽量保证组件的大小与parent的可视区域大小成所设定的比例。有以下几点需要注意:
组件的百分比大小和精确大小是互斥的属性,当设置了组件的percentWidth和percentHeight时,相应的explicitWidth和
explicitHeight属性就是NaN,反之亦然。而width和height指的是组件在布局过程执行完成后实际的长宽,并不会因为设置了百分比
大小就为NaN。只是通过width和height设置精确大小时,会同时设定explicitWidth和explicitHeight属性,从而使
percentWidth和percentHeight属性为NaN。
组件百分比大小指的是相对其parent中的可视区域的大小的百分比,也就是刨除parent的border
width、padding、gap等区域后(gap个数会根据组件数量而定),用于放置组件的那个区域的大小,并不是parent的实际大小。对于
Tile container或者TileLayout,children的百分比是指相对于每个tile
cell的百分比,对于其它大部分Container,百分比是相对于整个容器可视区域的。
当组件设置为百分比大小时,组件的实际大小是在parent的大小调整过程中计算出来的,如果按照设定的比例超出了组件的minimum
size和maximun size范围,那么组件会被设置成minimum size或maximun size(组件的minimum
size会根据组件和组件所包含的child不同而不同),而不是百分比指定的大小(因此百分比大小只是一个建议值)。
当组件设置为百分比时,如果组件的parent是自动布局的,并且还包含了其它组件,那么parent会先保证设置为精确大小和默认大小的child组件
以及parent相应的border
width、padding和gap先分配空间;对于设置成百分比大小的child组件,会根据parent的可视区域大小(排除border
width、padding和相应数量的gap之后的区域大小)尝试按照设置的百分比设置组件的大小,但是如果这些组件的大小超出了parent剩余的空
间,那么parent会把剩余空间按照组件的百分比所构成的比例,分配给每个百分比组件(同时也要保证组件大小在minimum
size或maximun size之间)。例如Hbox的实际宽度是400(确定实际宽度时,是先layout
pass过程,先确定parent才确定child),包含左右padding各50,包含一个设置了宽度为120的button,parent的gap
为40,还有两个设置了宽度为60%和30%的组件,那么计算这两个组件实际宽度时,首先分配一个button和左右padding以及2个gap(3个
组件因此有2个gap)的空间,总大小为120 + 2×50 + 2×40 =
300,parent中剩余的区域还有100。根据百分比两个组件的大小是(400- 2×50 - 2×40)×60%和(400- 2×50 -
2×40)×30%,分别为132和66,但是132+66大于parent剩余的空间,因此,parent把剩余的100空间分为两个分给两个组
件,60%的组件分到的空间是100×60/(60+30),30%的组件分到的空间是100×30/(60+30),分别是67和33,分配到的大小满
足在minimum size或maximun size之间,因此最终组件的实际大小就是这个值。如果手动设置两个百分比组件的minimum
size为70和50,那么67和33就不满足可取的值范围,因此组件实际大小会被设定为70和50,这样就会超出HBox的可视区域,由此就会出现滚动
条(也可以设置不出现滚动条)。
当组件设置为百分比时,如果组件的parent是绝对布局的,对于halo
Container的child,会根据parent的可视区域大小乘以百分比计算实际大小,同时还考虑minimum size或maximun
size约束,也考虑组件的位置,保证组件处于哪个位置上时实际大小不会超出parent的边界。对于spark
Container的child,会根据parent的可视区域大小乘以百分比计算实际大小,同时还考虑minimum size或maximun
size约束,但不考虑child自身位置的影响。
分享到:
相关推荐
微信小程序 FlexLayout布局 (源码)微信小程序 FlexLayout布局 (源码)微信小程序 FlexLayout布局 (源码)微信小程序 FlexLayout布局 (源码)微信小程序 FlexLayout布局 (源码)微信小程序 FlexLayout布局 (源码)微信小...
小程序源码 FlexLayout布局 (代码+截图)小程序源码 FlexLayout布局 (代码+截图)小程序源码 FlexLayout布局 (代码+截图)小程序源码 FlexLayout布局 (代码+截图)小程序源码 FlexLayout布局 (代码+截图)小程序源码 Flex...
本话题聚焦于“小程序源码FlexLayout布局”,这是一份关于如何在小程序开发中运用Flex布局的源码资源。Flex布局是现代前端开发中的重要布局模式,尤其在移动端应用设计中广泛使用,因为它能灵活地处理不同屏幕尺寸和...
本源代码将研究学习微信小程序的FlexLayout布局实例,微信小程序界面设计实例,是一种流布局的实现例子,而不是大家熟悉的盒子式布局,据说即使需要深层的嵌套,FlexLayout布局的响应速度也不会超过1ms,可谓是非常...
FlexLayout.html
微信小程序 - FlexLayout布局【源码】.zip 微信小程序 - FlexLayout布局【源码】.zip 微信小程序 - FlexLayout布局【源码】.zip 微信小程序 - FlexLayout布局【源码】.zip 微信小程序 - FlexLayout布局【源码】.zip ...
微信小程序源码 FlexLayout布局(学习版)微信小程序源码 FlexLayout布局(学习版)微信小程序源码 FlexLayout布局(学习版)微信小程序源码 FlexLayout布局(学习版)微信小程序源码 FlexLayout布局(学习版)微信小程序源码 ...
微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——FlexLayout布局(截图+源码).zip 微信小程序——...
FlexLayout布局是微信小程序开发中常用的一种布局方式,主要用于实现复杂的界面设计,让元素在不同尺寸的屏幕中自适应展示。微信小程序的FlexLayout基于CSS3的Flexbox模型,允许开发者更加灵活地控制组件的排列、...
在微信小程序开发中,FlexLayout布局是一种非常重要的布局方式,它允许开发者在有限的空间内灵活地安排组件的位置,实现各种复杂的界面设计。本示例主要探讨了如何在微信小程序中运用FlexLayout,以及其源码背后的...
FlexLayout布局是现代网页设计中常用的一种布局方式,它基于CSS3中的 Flexible Box 模块,简称 Flexbox。这种布局模式极大地提高了网页设计的灵活性,能够轻松处理元素的对齐、排列以及尺寸调整,尤其在响应式设计和...
FlexLayout布局小程序源码是专为小程序开发设计的一种布局解决方案,它基于CSS的Flexbox模型,使得在小程序中实现复杂的动态布局变得更为简单。本文将深入探讨FlexLayout布局的原理、使用方法以及如何在小程序中应用...
【FlexLayout布局】是前端开发中的一个重要概念,尤其在微信小程序开发中,它是一种用于创建弹性布局的CSS样式规则,可以有效地实现响应式设计。在微信小程序中,开发者经常使用FlexLayout来创建复杂的用户界面,...
FlexLayout布局是前端开发中的一个重要概念,特别是在微信小程序和H5页面设计中,它提供了一种灵活、可扩展的布局方式,使得元素能够在不同屏幕尺寸和设备上自适应展示。在微信小程序中,使用FlexLayout可以更好地...
在这个主题中,我们主要探讨的是FlexLayout布局在微信小程序中的应用及其源码解析。 FlexLayout,又称为弹性盒子布局,是Web开发中用于创建响应式和动态布局的一种CSS布局模型。它允许开发者更加灵活地安排元素的...
FlexLayout FlexLayout是一个布局管理器,用于将React组件布置在多个选项卡集中,可以调整和移动选项卡的大小。现在使用尝试FlexLayout唯一的依赖关系是React。 特征: 分离器标签标签拖动和排序拖动选项卡集(一次...
在微信小程序开发中,FlexLayout布局是一种非常重要的布局方式,它允许开发者在有限的空间内灵活地安排元素,尤其适用于各种屏幕尺寸和分辨率的移动设备。本案例将深入探讨FlexLayout布局的基本概念、特性以及如何在...
在这个"微信小程序项目实例-wechat-app-flexlayout"中,我们将深入探讨Flex布局在微信小程序中的应用。 Flex布局,全称为Flexible Box布局,是CSS3中的一种新的布局模式,旨在提供更加灵活的盒状模型,以适应不同...
FlexLayout布局是现代Web开发中常用的一种布局方式,尤其在微信小程序、H5页面等移动端应用中被广泛采用。此布局模式允许开发者更加灵活地控制元素的排列方式,以适应不同屏幕尺寸和设备类型。在“企业城微信小程序...