柚子快報(bào)激活碼778899分享:Flutter 屏幕適配
柚子快報(bào)激活碼778899分享:Flutter 屏幕適配
fontSize: Adapt.px(30),
)
)
// 容器尺寸大小設(shè)置 一個(gè)設(shè)計(jì)圖為 300*300像素的容器
new Container( width: Adapt.px(300),
height: Adapt.px(300),
)
// 1px
new Container(
decoration: new BoxDecoration(
border: new Border(bottom:BorderSide(width: Adapt.one())),
),
)
屏幕適配方案插件-完美解決屏幕適配
插件地址
添加依賴(lài)
dependencies:
flutter:
sdk: flutter
添加依賴(lài)
flutter_screenutil: ^0.5.0
| 屬性 | 類(lèi)型 | 默認(rèn)值 | 描述 |
| — | — | — | — |
| width | int | 1080px | 設(shè)計(jì)稿中設(shè)備的寬度,單位px |
| height | int | 1920px | 設(shè)計(jì)稿中設(shè)備的高度,單位px |
| allowFontScaling | bool | false | 設(shè)置字體大小是否根據(jù)系統(tǒng)的“字體大小”輔助選項(xiàng)來(lái)進(jìn)行縮放 |
初始化
@override
Widget build(BuildContext context) {
ScreenUtil.init(context, width: 750, height: 1624, allowFontScaling: true);
}
//填入設(shè)計(jì)稿中設(shè)備的屏幕尺寸
//默認(rèn) width : 1080px , height:1920px , allowFontScaling:false
ScreenUtil.instance = ScreenUtil.getInstance()…init(context);
//假如設(shè)計(jì)稿是按iPhone6的尺寸設(shè)計(jì)的(iPhone6 750*1334)
ScreenUtil.instance = ScreenUtil(width: 750, height: 1334)…init(context);
//設(shè)置字體大小根據(jù)系統(tǒng)的“字體大小”輔助選項(xiàng)來(lái)進(jìn)行縮放,默認(rèn)為false : 字體隨著系統(tǒng)的“字體大小”輔助選項(xiàng)來(lái)進(jìn)行縮放
ScreenUtil.instance = ScreenUtil(width: 750, height: 1334, allowFontScaling: true)…init(context);
適配尺寸
//長(zhǎng)方形:
Container(
width: ScreenUtil.getInstance().setWidth(375),
height: ScreenUtil.getInstance().setHeight(200),
),
//如果你想顯示一個(gè)正方形:
Container(
width: ScreenUtil.getInstance().setWidth(300),
height: ScreenUtil.getInstance().setWidth(300),
),
適配字體-傳入設(shè)計(jì)稿的px尺寸
//傳入字體大小,默認(rèn)不根據(jù)系統(tǒng)的“字體大小”輔助選項(xiàng)來(lái)進(jìn)行縮放(可在初始化ScreenUtil時(shí)設(shè)置allowFontScaling)
ScreenUtil.getInstance().setSp(28)
//傳入字體大小,根據(jù)系統(tǒng)的“字體大小”輔助選項(xiàng)來(lái)進(jìn)行縮放(如果某個(gè)地方不遵循全局的allowFontScaling設(shè)置)
ScreenUtil(allowFontScaling: true).setSp(28)
//for example:
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children:
Text('我的文字大小在設(shè)計(jì)稿上是25px,不會(huì)隨著系統(tǒng)的文字縮放比例變化',
style: TextStyle(
color: Colors.black, fontSize: ScreenUtil.getInstance().setSp(24))),
Text('我的文字大小在設(shè)計(jì)稿上是25px,會(huì)隨著系統(tǒng)的文字縮放比例變化',
style: TextStyle(
color: Colors.black, fontSize: ScreenUtil(allowFontScaling: true).setSp(24))),
],
)
其他相關(guān)api
ScreenUtil.pixelRatio //設(shè)備的像素密度
ScreenUtil.screenWidth //設(shè)備寬度
ScreenUtil.screenHeight //設(shè)備高度
ScreenUtil.bottomBarHeight //底部安全區(qū)距離,適用于全面屏下面有按鍵的
ScreenUtil.statusBarHeight //狀態(tài)欄高度 劉海屏?xí)? 單位px
ScreenUtil.textScaleFactory //系統(tǒng)字體縮放比例
ScreenUtil.getInstance().scaleWidth // 實(shí)際寬度的dp與設(shè)計(jì)稿px的比例
ScreenUtil.getInstance().scaleHeight // 實(shí)際高度的dp與設(shè)計(jì)稿px的比例
@override
Widget build(BuildContext context) {
//設(shè)置適配尺寸 (填入設(shè)計(jì)稿中設(shè)備的屏幕尺寸) 假如設(shè)計(jì)稿是按iPhone6的尺寸設(shè)計(jì)的(iPhone6 750*1334)
ScreenUtil.instance = ScreenUtil(width: 750, height: 1334)..init(context);
print('設(shè)備寬度:${ScreenUtil.screenWidth}'); //Device width
print('設(shè)備高度:${ScreenUtil.screenHeight}'); //Device height
print('設(shè)備的像素密度:${ScreenUtil.pixelRatio}'); //Device pixel density
print(
'底部安全區(qū)距離:${ScreenUtil.bottomBarHeight}'); //Bottom safe zone distance,suitable for buttons with full screen
print(
'狀態(tài)欄高度:${ScreenUtil.statusBarHeight}px'); //Status bar height , Notch will be higher Unit px
print('實(shí)際寬度的dp與設(shè)計(jì)稿px的比例:${ScreenUtil.getInstance().scaleWidth}');
print('實(shí)際高度的dp與設(shè)計(jì)稿px的比例:${ScreenUtil.getInstance().scaleHeight}');
print(
'寬度和字體相對(duì)于設(shè)計(jì)稿放大的比例:${ScreenUtil.getInstance().scaleWidth * ScreenUtil.pixelRatio}');
print(
'高度相對(duì)于設(shè)計(jì)稿放大的比例:${ScreenUtil.getInstance().scaleHeight * ScreenUtil.pixelRatio}');
print('系統(tǒng)的字體縮放比例:${ScreenUtil.textScaleFactory}');
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children:
Row(
children:
Container(
width: ScreenUtil.getInstance().setWidth(375),
height: ScreenUtil.getInstance().setHeight(200),
color: Colors.red,
child: Text(
'我的寬度:${ScreenUtil.getInstance().setWidth(375)}dp',
style: TextStyle(
color: Colors.white,
fontSize: ScreenUtil.getInstance().setSp(12),
),
),
),
Container(
width: ScreenUtil.getInstance().setWidth(375),
height: ScreenUtil.getInstance().setHeight(200),
color: Colors.blue,
child: Text('我的寬度:${ScreenUtil.getInstance().setWidth(375)}dp',
style: TextStyle(
color: Colors.white,
fontSize: ScreenUtil.getInstance().setSp(12),
)),
),
],
),
Text('設(shè)備寬度:${ScreenUtil.screenWidth}px'),
Text('設(shè)備高度:${ScreenUtil.screenHeight}px'),
Text('設(shè)備的像素密度:${ScreenUtil.pixelRatio}'),
Text('底部安全區(qū)距離:${ScreenUtil.bottomBarHeight}px'),
Text('狀態(tài)欄高度:${ScreenUtil.statusBarHeight}px'),
Text(
'實(shí)際高度的dp與設(shè)計(jì)稿px的比例:${ScreenUtil.getInstance().scaleHeight}',
textAlign: TextAlign.center,
),
Text(
'實(shí)際高度的dp與設(shè)計(jì)稿px的比例:${ScreenUtil.getInstance().scaleHeight}',
textAlign: TextAlign.center,
),
Text(
'寬度和字體相對(duì)于設(shè)計(jì)稿放大的比例:${ScreenUtil.getInstance().scaleWidth * ScreenUtil.pixelRatio}',
textAlign: TextAlign.center,
),
Text(
'高度相對(duì)于設(shè)計(jì)稿放大的比例:${ScreenUtil.getInstance().scaleHeight * ScreenUtil.pixelRatio}',
textAlign: TextAlign.center,
),
SizedBox(
height: ScreenUtil.getInstance().setHeight(100),
),
Text('系統(tǒng)的字體縮放比例:${ScreenUtil.textScaleFactory}'),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children:
Text('我的文字大小在設(shè)計(jì)稿上是25px,不會(huì)隨著系統(tǒng)的文字縮放比例變化',
style: TextStyle(
color: Colors.black, fontSize: ScreenUtil.getInstance().setSp(24))),
Text('我的文字大小在設(shè)計(jì)稿上是25px,會(huì)隨著系統(tǒng)的文字縮放比例變化',
style: TextStyle(
color: Colors.black, fontSize: ScreenUtil(allowFontScaling: true).setSp(24))),
],
)
],
),
),
);
}
全面屏、折疊屏適配與兼容問(wèn)題
一 啟動(dòng)白屏問(wèn)題
采用Flutter 開(kāi)發(fā)的app,無(wú)論Android還是Ios,都會(huì)出現(xiàn)白屏的現(xiàn)象,大概持續(xù)1-3秒,他會(huì)根據(jù)手機(jī)或模擬器的速溶而不同,時(shí)間可長(zhǎng)可短。Flutter 應(yīng)用在啟動(dòng)的時(shí)候會(huì)先啟動(dòng)Flutter SDK, 然后加載到內(nèi)存里面 ,然后完成渲染,在這個(gè)過(guò)程中 它是沒(méi)有內(nèi)容可以顯示的,因此會(huì)顯示白屏.
二 解決白屏問(wèn)題
(1)可以在flutter項(xiàng)目中引入插件
https://pub.dev/packages/flutter_splash_screen
注意 :Android App啟動(dòng)的時(shí)候,會(huì)有一個(gè)默認(rèn)的白屏 ,這個(gè)白屏在啟動(dòng)的時(shí)候會(huì)顯示主題,如果主體色不是透明的 就會(huì)有個(gè)白屏
Android的白屏非兩個(gè)部分,一個(gè)是主題的白屏(如果主題不是透明的時(shí)候,點(diǎn)擊圖標(biāo)會(huì)顯示白屏),二,當(dāng)App啟動(dòng)起來(lái)之后,會(huì)顯示啟動(dòng)屏(如果沒(méi)有啟動(dòng)屏,會(huì)顯示默認(rèn)的白屏)
二 Flutter 全面屏適配指南
1)全面屏特點(diǎn),以及存在問(wèn)題
特點(diǎn):
1 大屏占比高、長(zhǎng)寬比不再試16:9,達(dá)到了19.5:9甚至更高
2 短邊的像素,density的取值是一樣的 所有適配的是長(zhǎng)邊
問(wèn)題:
1. 傳統(tǒng)布局的高度不足,導(dǎo)致上下留黑邊
2. 基于屏幕頂部或底部的布局,如彈框,在全面屏手機(jī)上會(huì)發(fā)生位移
3. 安全區(qū)域問(wèn)題
Flutter中全面屏的頁(yè)面適配分兩種情況:
1.一種是對(duì)于頁(yè)面已經(jīng)使用了Scaffold的appBar 與bottomNavigationBar頁(yè)面是不需要額外適配的,因?yàn)镾caffold框架會(huì)自動(dòng)化幫助我們完成這些適配工作;
2. 另外一種情況,沒(méi)有使用了Scaffold或者****Scaffold的appBar 與bottomNavigationBar頁(yè)面,改如何適配全面屏呢?
(1) 適配要點(diǎn)
.?頂部NavigationBar上部留安全區(qū)域
.??底部****NavigationBar底部留安全區(qū)域
對(duì)于安全區(qū)域的適配有兩種方案:
**1. 采用 SafeArea來(lái)包裹頁(yè)面,**SafeArea是Flutter中的一個(gè)用于全面屏的一個(gè)組件,類(lèi)似RN中SafeAreaView 主要用于解決適配全面屏手機(jī)的安全取悅問(wèn)題;
2.借助MeadiaQuery.of(context).padding 獲取屏幕四周的padding,然后根據(jù)padding自己手動(dòng)實(shí)現(xiàn)對(duì)安全區(qū)域的控制;
. 方案一:相對(duì)簡(jiǎn)單的,只需要引入****SafeArea,但不夠靈活
. 方案二:需要借助****MeadiaQuery.of(context).padding自己實(shí)現(xiàn)對(duì)安全區(qū)域的控制,相對(duì)復(fù)雜些,但靈活度高
借助 MediaQuery.of(context).padding手動(dòng)適配
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)初中級(jí)Android工程師,想要提升技能,往往是自己摸索成長(zhǎng)或者是報(bào)班學(xué)習(xí),但對(duì)于培訓(xùn)機(jī)構(gòu)動(dòng)則近萬(wàn)的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年Android移動(dòng)開(kāi)發(fā)全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時(shí)減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Android開(kāi)發(fā)知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且會(huì)持續(xù)更新!
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以掃碼獲?。。。▊渥ⅲ篈ndroid)
總結(jié)
最后為了幫助大家深刻理解Android相關(guān)知識(shí)點(diǎn)的原理以及面試相關(guān)知識(shí),這里放上相關(guān)的我搜集整理的Android開(kāi)發(fā)中高級(jí)必知必會(huì)核心筆記,共計(jì)2968頁(yè)P(yáng)DF、58w字,囊括Android開(kāi)發(fā)648個(gè)知識(shí)點(diǎn),我把技術(shù)點(diǎn)整理成了視頻和PDF(實(shí)際上比預(yù)期多花了不少精力),包知識(shí)脈絡(luò) + 諸多細(xì)節(jié)。
網(wǎng)上學(xué)習(xí) Android的資料一大堆,但如果學(xué)到的知識(shí)不成體系,遇到問(wèn)題時(shí)只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。希望這份系統(tǒng)化的技術(shù)體系對(duì)大家有一個(gè)方向參考。
2021年雖然路途坎坷,都在說(shuō)Android要沒(méi)落,但是,不要慌,做自己的計(jì)劃,學(xué)自己的習(xí),競(jìng)爭(zhēng)無(wú)處不在,每個(gè)行業(yè)都是如此。相信自己,沒(méi)有做不到的,只有想不到的。
雖然面試失敗了,但我也不會(huì)放棄入職字節(jié)跳動(dòng)的決心的!建議大家面試之前都要有充分的準(zhǔn)備,順順利利的拿到自己心儀的offer。
《互聯(lián)網(wǎng)大廠面試真題解析、進(jìn)階開(kāi)發(fā)核心學(xué)習(xí)筆記、全套講解視頻、實(shí)戰(zhàn)項(xiàng)目源碼講義》點(diǎn)擊傳送門(mén)即可獲??!
gtp.com/2024/03/13/H4lCoPEF.jpg" />
總結(jié)
最后為了幫助大家深刻理解Android相關(guān)知識(shí)點(diǎn)的原理以及面試相關(guān)知識(shí),這里放上相關(guān)的我搜集整理的Android開(kāi)發(fā)中高級(jí)必知必會(huì)核心筆記,共計(jì)2968頁(yè)P(yáng)DF、58w字,囊括Android開(kāi)發(fā)648個(gè)知識(shí)點(diǎn),我把技術(shù)點(diǎn)整理成了視頻和PDF(實(shí)際上比預(yù)期多花了不少精力),包知識(shí)脈絡(luò) + 諸多細(xì)節(jié)。
[外鏈圖片轉(zhuǎn)存中…(img-tNCXeFDZ-1713311249798)]
網(wǎng)上學(xué)習(xí) Android的資料一大堆,但如果學(xué)到的知識(shí)不成體系,遇到問(wèn)題時(shí)只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。希望這份系統(tǒng)化的技術(shù)體系對(duì)大家有一個(gè)方向參考。
2021年雖然路途坎坷,都在說(shuō)Android要沒(méi)落,但是,不要慌,做自己的計(jì)劃,學(xué)自己的習(xí),競(jìng)爭(zhēng)無(wú)處不在,每個(gè)行業(yè)都是如此。相信自己,沒(méi)有做不到的,只有想不到的。
雖然面試失敗了,但我也不會(huì)放棄入職字節(jié)跳動(dòng)的決心的!建議大家面試之前都要有充分的準(zhǔn)備,順順利利的拿到自己心儀的offer。
《互聯(lián)網(wǎng)大廠面試真題解析、進(jìn)階開(kāi)發(fā)核心學(xué)習(xí)筆記、全套講解視頻、實(shí)戰(zhàn)項(xiàng)目源碼講義》點(diǎn)擊傳送門(mén)即可獲??!
柚子快報(bào)激活碼778899分享:Flutter 屏幕適配
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。