日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

固定底部 布局_Google Flutter 布局(四)-Baseline IntrinsicWidth详解

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 固定底部 布局_Google Flutter 布局(四)-Baseline IntrinsicWidth详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.1 簡介

Baseline這個控件,做過移動端開發的都會了解過,一般文字排版的時候,可能會用到它。它的作用很簡單,根據child的baseline,來調整child的位置。例如兩個字號不一樣的文字,希望底部在一條水平線上,就可以使用這個控件,是一個非常基礎的控件。

關于字符的Baseline,可以看下下面這張圖,這具體就涉及到了字體排版,感興趣的同學可以自行了解。

1.2 布局行為

Baseline控件布局行為分為兩種情況:

  • 如果child有baseline,則根據child的baseline屬性,調整child的位置;
  • 如果child沒有baseline,則根據child的bottom,來調整child的位置。

1.3 繼承關系

Object > Diagnosticable > DiagnosticableTree > Widget > RenderObjectWidget > SingleChildRenderObjectWidget > Baseline

1.4 示例代碼

new Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ new Baseline( baseline: 50.0, baselineType: TextBaseline.alphabetic, child: new Text( 'TjTjTj', style: new TextStyle( fontSize: 20.0, textBaseline: TextBaseline.alphabetic, ), ), ), new Baseline( baseline: 50.0, baselineType: TextBaseline.alphabetic, child: new Container( width: 30.0, height: 30.0, color: Colors.red, ), ), new Baseline( baseline: 50.0, baselineType: TextBaseline.alphabetic, child: new Text( 'RyRyRy', style: new TextStyle( fontSize: 35.0, textBaseline: TextBaseline.alphabetic, ), ), ), ],)

上述運行結果是左右兩個文本跟中間的Container底部在一個水平線上,這也印證了Baseline的布局行為。

1.5 源碼解析

const Baseline({ Key key, @required this.baseline, @required this.baselineType, Widget child})

1.5.1 屬性解析

baseline:baseline數值,必須要有,從頂部算。

baselineType:bseline類型,也是必須要有的,目前有兩種類型:

  • alphabetic:對齊字符底部的水平線;
  • ideographic:對齊表意字符的水平線。

1.5.2 源碼

我們來看看源碼中具體計算尺寸的這段代碼

child.layout(constraints.loosen(), parentUsesSize: true);final double childBaseline = child.getDistanceToBaseline(baselineType);final double actualBaseline = baseline;final double top = actualBaseline - childBaseline;final BoxParentData childParentData = child.parentData;childParentData.offset = new Offset(0.0, top);final Size childSize = child.size;size = constraints.constrain(new Size(childSize.width, top + childSize.height));

getDistanceToBaseline這個函數是獲取baseline數值的,存在的話,就取這個值,不存在的話,則取其高度。

整體的計算過程:

  • 獲取child的 baseline 值;
  • 計算出top值,其為 baseline - childBaseline,這個值有可能為負數;
  • 計算出Baseline控件尺寸,寬度為child的,高度則為 top + childSize.height。
  • 1.6 使用場景

    跟字符對齊相關的會用到,其他場景暫時沒有想到。

    2. FractionallySizedBox

    A widget that sizes its child to a fraction of the total available space

    2.1 簡介

    FractionallySizedBox控件會根據現有空間,來調整child的尺寸,所以說child就算設置了具體的尺寸數值,也不起作用。

    2.2 布局行為

    FractionallySizedBox的布局行為主要跟它的寬高因子兩個參數有關,當參數為null或者有具體數值的時候,布局表現不一樣。當然,還有一個輔助參數alignment,作為對齊方式進行布局。

    • 當設置了具體的寬高因子,具體的寬高則根據現有空間寬高 * 因子,有可能會超出父控件的范圍,當寬高因子大于1的時候;
    • 當沒有設置寬高因子,則填滿可用區域;

    2.3 繼承關系

    Object > Diagnosticable > DiagnosticableTree > Widget > RenderObjectWidget > SingleChildRenderObjectWidget > FractionallySizedBox

    2.4 示例代碼

    new Container( color: Colors.blue, height: 150.0, width: 150.0, padding: const EdgeInsets.all(10.0), child: new FractionallySizedBox( alignment: Alignment.topLeft, widthFactor: 1.5, heightFactor: 0.5, child: new Container( color: Colors.red, ), ), )

    運行效果如下所示

    2.5 源碼解析

    const FractionallySizedBox({ Key key, this.alignment = Alignment.center, this.widthFactor, this.heightFactor, Widget child,})

    2.5.1 屬性解析

    alignment:對齊方式,不能為null。

    widthFactor:寬度因子,跟之前介紹的控件類似,寬度乘以這個值,就是最后的寬度。

    heightFactor:高度因子,用作計算最后實際高度的。

    其中widthFactor和heightFactor都有一個規則

    • 如果不為null,那么實際的最大寬高度則為child的寬高乘以這個因子;
    • 如果為null,那么child的寬高則會盡量充滿整個區域。

    2.5.2 源碼

    FractionallySizedBox內部具體渲染是由RenderFractionallySizedOverflowBox來實現的,通過命名就可以看出,這個控件可能會Overflow。

    我們直接看實際計算尺寸的代碼

    double minWidth = constraints.minWidth;double maxWidth = constraints.maxWidth;if (_widthFactor != null) { final double width = maxWidth * _widthFactor; minWidth = width; maxWidth = width;}double minHeight = constraints.minHeight;double maxHeight = constraints.maxHeight;if (_heightFactor != null) { final double height = maxHeight * _heightFactor; minHeight = height; maxHeight = height;}

    源代碼中,根據寬高因子是否存在,來進行相對應的尺寸計算。這個過程非常簡單,不再贅述。

    2.6 使用場景

    當需要在一個區域里面取百分比尺寸的時候,可以使用這個,比方說,高度40%寬度70%的區域。當然,AspectRatio也可以達到近似的效果。

    3. IntrinsicHeight

    A widget that sizes its child to the child's intrinsic height.

    3.1 簡介

    IntrinsicHeight的作用是調整child到固定的高度。這個控件筆者也是看了很久,不知道它的作用是什么,官方說這個很有用,但是應該盡量少用,因為其效率問題。

    3.2 布局行為

    這個控件的作用,是將可能高度不受限制的child,調整到一個合適并且合理的尺寸。

    3.3 繼承關系

    Object > Diagnosticable > DiagnosticableTree > Widget > RenderObjectWidget > SingleChildRenderObjectWidget > IntrinsicHeight

    3.4 示例代碼

    new IntrinsicHeight( child: new Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ new Container(color: Colors.blue, width: 100.0), new Container(color: Colors.red, width: 50.0,height: 50.0,), new Container(color: Colors.yellow, width: 150.0), ], ),);

    當沒有IntrinsicHeight包裹著,可以看到,第一三個Container高度是不受限制的,當外層套一個IntrinsicHeight,第一三個Container高度就調整到第二個一樣的高度。

    3.5 源碼解析

    構造函數如下:

    const IntrinsicHeight({ Key key, Widget child })

    3.5.1 屬性解析

    除了child,沒有提供額外的屬性。

    3.5.2 源碼

    當child不為null的時候,具體的布局代碼如下:

    BoxConstraints childConstraints = constraints;if (!childConstraints.hasTightHeight) { final double height = child.getMaxIntrinsicHeight(childConstraints.maxWidth); assert(height.isFinite); childConstraints = childConstraints.tighten(height: height);}child.layout(childConstraints, parentUsesSize: true);size = child.size;

    首先會檢測是否只有一個高度值滿足約束條件,如果不是的話,則返回一個最小的高度。然后調整尺寸。

    3.6 使用場景

    說老實話,不知道在什么場景使用,可以替代的控件也有的。谷歌說很有用,效率會有問題,建議一般的就別用了。

    4. IntrinsicWidth

    A widget that sizes its child to the child's intrinsic width.

    4.1 簡介

    IntrinsicWidth從描述看,跟IntrinsicHeight類似,一個是調整高度,一個是調整寬度。同樣是會存在效率問題,能別使用就盡量別使用。

    4.2 布局行為

    IntrinsicWidth不同于IntrinsicHeight,它包含了額外的兩個參數,stepHeight以及stepWidth。而IntrinsicWidth的布局行為跟這兩個參數相關。

    • 當stepWidth不是null的時候,child的寬度將會是stepWidth的倍數,當stepWidth值比child最小寬度小的時候,這個值不起作用;
    • 當stepWidth為null的時候,child的寬度是child的最小寬度;
    • 當stepHeight不為null的時候,效果跟stepWidth相同;
    • 當stepHeight為null的時候,高度取最大高度。

    4.3 繼承關系

    Diagnosticable > DiagnosticableTree > Widget > RenderObjectWidget > SingleChildRenderObjectWidget > IntrinsicWidth

    4.4 示例代碼

    new Container( color: Colors.green, padding: const EdgeInsets.all(5.0), child: new IntrinsicWidth( stepHeight: 450.0, stepWidth: 300.0, child: new Column( children: [ new Container(color: Colors.blue, height: 100.0), new Container(color: Colors.red, width: 150.0, height: 100.0), new Container(color: Colors.yellow, height: 150.0,), ], ), ),)

    分別對stepWidth以及stepHeight設置不同的值,可以看到不同的效果,當step值比最小寬高小的時候,這個值其實是不起作用的。感興趣的同學可以自己試試。

    4.5 源碼解析

    構造函數

    const IntrinsicWidth({ Key key, this.stepWidth, this.stepHeight, Widget child })

    4.5.1 屬性解析

    stepWidth:可以為null,效果參看上面所說的布局行為。

    stepHeight:可以為null,效果參看上面所說的布局行為。

    4.5.2 源碼

    我們先來看看布局代碼中_applyStep函數

    static double _applyStep(double input, double step) {assert(input.isFinite);if (step == null) return input;return (input / step).ceil() * step;}

    如果存在step數值的話,則會是step的倍數,如果step為null,則返回原始的尺寸。

    接下來我們看看child不為null時候的布局代碼

    BoxConstraints childConstraints = constraints;if (!childConstraints.hasTightWidth) { final double width = child.getMaxIntrinsicWidth(childConstraints.maxHeight); assert(width.isFinite); childConstraints = childConstraints.tighten(width: _applyStep(width, _stepWidth));}if (_stepHeight != null) { final double height = child.getMaxIntrinsicHeight(childConstraints.maxWidth); assert(height.isFinite); childConstraints = childConstraints.tighten(height: _applyStep(height, _stepHeight));}child.layout(childConstraints, parentUsesSize: true);size = child.size;

    寬度方面的布局跟IntrinsicHeight高度部分相似,只是多了一個step的額外數值。總體的布局表現跟上面分析的布局行為一致,根據step值是否是null來進行判斷,但是注意其對待高度與寬度的表現略有差異。

    4.6 使用場景

    這個控件,說老實話,筆者還是不知道該在什么場景下使用,可能會有些特殊的場景。但是從IntrinsicWidth與IntrinsicHeight布局差異看,Flutter基礎控件封的確實很隨性,一些可有可無甚至是重復的控件,我覺得精簡精簡挺好的,哈哈。

    總結

    以上是生活随笔為你收集整理的固定底部 布局_Google Flutter 布局(四)-Baseline IntrinsicWidth详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久视频这里只有精品 | 国产wwwwwww | 精品一区精品二区 | 日本少妇裸体做爰高潮片 | 怡红院av亚洲一区二区三区h | 强迫凌虐淫辱の牝奴在线观看 | 亚洲免费成人网 | 永久免费观看av | 欧美插插视频 | 成人禁污污啪啪入口 | www.爱色av.com | 丝袜av网站 | 成人免费在线观看网站 | 国产精品嫩| av中文在线资源 | 午夜在线免费视频 | 福利电影一区二区三区 | 国产精品一线天 | 精品久久久久久久久久久久久久久久久 | 国产一级一级国产 | 亚洲一区二区动漫 | 一区二区高清在线 | 东京热一区二区三区四区 | 荫蒂被男人添免费视频 | 一级一毛片 | 狠狠干2024 | 欧美与黑人午夜性猛交久久久 | 天堂在线 | av看片网站| 99精品久久久久久 | 亚洲自拍色图 | 国产一二区在线观看 | 欧美男人又粗又长又大 | 中国毛片视频 | 韩日在线视频 | 久热中文 | 在线看一区 | 波多野结衣在线观看一区二区三区 | av大片免费看 | 欧美一级在线视频 | 午夜一区二区三区免费 | 欧美色图俺去了 | 美女诱惑一区 | 人妻一区二区三区视频 | 国产传媒一区二区三区 | 丝袜 亚洲 另类 欧美 重口 | 黄色的视频网站 | 欧美尹人| 看片久久 | 爱爱免费网站 | 美女网站污| 成人污污视频 | 毛茸茸亚洲孕妇孕交片 | 国产精品传媒一区二区 | 亚洲乱子伦 | 精品国产99久久久久久 | 精品色哟哟 | 在线一区二区不卡 | 免费在线观看小视频 | 日韩欧美成人一区二区 | 欧洲精品一区 | 性欧美4khd高清极品 | 精品欧美一区二区三区成人 | 三年中国片在线高清观看 | 日本不卡一区二区 | 亚洲伦理在线观看 | 波多野结衣91 | av黄色网址 | 亚洲欧洲色图 | 91成人动漫| 国产亚洲精品久久久久动 | 欧美视频免费在线 | 一级一片免费播放 | 无码精品一区二区免费 | 日本亚洲欧洲色 | 91久久精品美女高潮 | 最近免费中文字幕中文高清百度 | 日韩电影三级 | 性欧美欧美巨大69 | 在线美女av| 国产一区二区三区精品愉拍 | 久久激情五月 | 国产又粗又黄又爽又硬的视频 | 最好看的日本字幕mv视频大全 | 日本最新中文字幕 | 国产精品免费看片 | 天天爱天天操 | 精品国模| 91二区| 精品日韩中文字幕 | 亚洲理论在线观看 | 免费在线观看污网站 | 中文字幕8 | 嫩草一区二区 | 午夜在线看 | 国产免费看黄 | 国产原创在线观看 | 国产在线观看你懂的 | 国产精品影音先锋 |