Flutter應(yīng)用框架搭建實(shí)現(xiàn)屏幕適配方案詳解
原理
UI設(shè)計(jì)的時(shí)候一般會(huì)按照一個(gè)固定的尺寸進(jìn)行設(shè)計(jì),如 360 x 690 ,實(shí)際設(shè)備分辨率可能是 Google Pixel: 1080 x 1920 、Google Pixel XL: 1440 x 2560 、iPhone 12 Pro Max: 1284 x 2778 等等。開(kāi)發(fā)時(shí)如果直接按照設(shè)計(jì)圖寫(xiě)死數(shù)值則會(huì)出現(xiàn)最后實(shí)現(xiàn)的效果跟設(shè)計(jì)效果不一致的情況。這個(gè)時(shí)候就可以用比例的方式來(lái)進(jìn)行適配。
將設(shè)計(jì)圖分為固定單位并給這個(gè)單位定義一個(gè)標(biāo)識(shí),例如就叫 w,然后通過(guò)獲取設(shè)備分辨率,使用設(shè)備真實(shí)寬度除以設(shè)計(jì)圖寬度 ,就得到了 1w 代表的真實(shí)寬度:
1w = 設(shè)備真實(shí)寬度 / 設(shè)計(jì)圖寬度
如設(shè)計(jì)圖尺寸是 360 x 690 ,則寬度為 360w ,真實(shí)設(shè)備寬度為 1080 則 1w = 1080 / 360 = 3。
根據(jù)上面的算法,得到對(duì)應(yīng)設(shè)備的 1w 的真實(shí)寬度:
Google Pixel: 1w = 1080 / 360 = 3
Google Pixel XL: 1w = 1440 / 360 = 4
iPhone 12 Pro Max: 1w = 1284 / 360 = 3.57
按照同樣的算法,可以給高度定義一個(gè)單位為 h , 得出對(duì)應(yīng)設(shè)備的高度單位的真實(shí)值,如下:
Google Pixel: 1h = 1920 / 690 = 2.78
Google Pixel XL: 1h = 2560 / 690 = 3.71
iPhone 12 Pro Max: 1h = 2778 / 690 = 4.03
得到換算以后 w、h 的真實(shí)值以后,開(kāi)發(fā)過(guò)程中就可以使用其來(lái)設(shè)置 UI 控件的高、寬、間距等,使其最終呈現(xiàn)的效果無(wú)限接近設(shè)計(jì)圖的效果。
開(kāi)發(fā)過(guò)程中一般采用寬度來(lái)進(jìn)行適配,控件高度要么自適應(yīng),要么也設(shè)置寬度的單位,然后整體高度根據(jù)內(nèi)容自適應(yīng)。但是如果有特殊需求也可以使用高度來(lái)進(jìn)行適配,比如需求要求是 banner 占屏幕的 1/4 ,或者要求內(nèi)容剛好一屏顯示,這個(gè)時(shí)候設(shè)置控件的高度時(shí)就可以采用高度單位來(lái)進(jìn)行適配。
基于上面的算法,在項(xiàng)目中就可以實(shí)現(xiàn)對(duì)應(yīng)的適配方案了,但本著不重復(fù)造輪子的思想,項(xiàng)目開(kāi)發(fā)中可以直接使用 flutter_screenutil 這個(gè)適配庫(kù)。
推薦方法
直接使用ScreenUtil.init方法,傳入屏幕尺寸、設(shè)計(jì)圖尺寸和屏幕方向可以對(duì)flutter_screenutil進(jìn)行初始化,代碼如下:
ScreenUtil.init(
BoxConstraints(
maxWidth: MediaQuery.of(context).size.width, //屏幕寬度
maxHeight: MediaQuery.of(context).size.height, //屏幕高度
),
designSize: const Size(360, 690), // 設(shè)計(jì)圖尺寸
orientation: Orientation.portrait); // 屏幕方向
)
使用這種方式只需要在使用flutter_screenutil前進(jìn)行初始化即可,一般放在根路由即第一個(gè)頁(yè)面加載的時(shí)候進(jìn)行初始化。
注意:ScreenUtil.init不能夠在MyApp中進(jìn)行初始化,此時(shí)還沒(méi)有加載MaterialApp無(wú)法使用MediaQuery.of(context)獲取到屏幕的寬高。
初始化以后就可以使用flutter_screenutil提供的方法獲取到適配后的數(shù)值進(jìn)行使用了。
可以通過(guò)如下的api獲取寬高以及字體的適配數(shù)值。
ScreenUtil().setWidth(540) //根據(jù)屏幕寬度適配尺寸 ScreenUtil().setHeight(200) //根據(jù)屏幕高度適配尺寸(一般根據(jù)寬度適配即可) ScreenUtil().radius(200) //根據(jù)寬度或高度中的較小者進(jìn)行調(diào)整 ScreenUtil().setSp(24) //字體大小適配
傳入的參數(shù)即為設(shè)計(jì)圖上的大小。在實(shí)際使用中的示例如下:
Container(
width: ScreenUtil().setWidth(200),
height: ScreenUtil().setHeight(540),
child: Text("Hello", style: TextStyle(fontSize: ScreenUtil().setSp(24)),),
);
flutter_screenutil更簡(jiǎn)單的寫(xiě)法,使用dart擴(kuò)展的num類型:
上面的每一個(gè)方法和下面的相對(duì)應(yīng):
ScreenUtil().setWidth(540) => 540.h ScreenUtil().setHeight(200) => 200.w ScreenUtil().radius(200) => 200.r ScreenUtil().setSp(24) => 24.sp
相應(yīng)的修改之后的使用示例:
Container(
width: 200.w,
height: 540.h,
child: Text("Hello", style: TextStyle(fontSize: 24.sp),),
);
注意:1.w!=1.h除非屏幕的分辨率比例和設(shè)計(jì)圖的比例一致,所以要設(shè)置正方形,切記使用相同的單位,如果設(shè)置相同的w和h,可能是長(zhǎng)方形。
除了上面的4鐘擴(kuò)展屬性以外,還提供了sm以及sw和sh
sm:取數(shù)值本身和sp的值較小的值,如:12.sm則取12和12.sp的值進(jìn)行比較,取較小的值。
sw:screen width的縮寫(xiě),表示的是屏幕寬度,作用是按照屏幕寬度比例返回值。如0.2sw則返回屏幕寬度的20%,1.sw則是整個(gè)屏幕寬度
sh:screen height的縮寫(xiě),即屏幕高度,作用于sw類似,返回指定比例的屏幕高度值。如1.sh為整個(gè)屏幕的高度。
使用sp作為字體單位,默認(rèn)是會(huì)隨著系統(tǒng)字體縮放進(jìn)行變化的,如果不想讓字體隨著系統(tǒng)的縮放進(jìn)行變化,可以設(shè)置textScaleFactor為1.0來(lái)實(shí)現(xiàn)。項(xiàng)目中可對(duì)MaterialApp進(jìn)行全局設(shè)置,或者對(duì)Text進(jìn)行單獨(dú)的設(shè)置。
全局設(shè)置:
MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter_ScreenUtil',
theme: ThemeData(
primarySwatch: Colors.blue,
),
builder: (context, widget) {
return MediaQuery(
///設(shè)置文字大小不隨系統(tǒng)設(shè)置改變
data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
child: widget,
);
},
home: HomePage(title: 'FlutterScreenUtil Demo'),
),
單獨(dú)設(shè)置:
Text("text", textScaleFactor: 1.0)
到此這篇關(guān)于Flutter應(yīng)用框架搭建實(shí)現(xiàn)屏幕適配方案詳解的文章就介紹到這了,更多相關(guān)Flutter屏幕適配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang+Android基于HttpURLConnection實(shí)現(xiàn)的文件上傳功能示例
這篇文章主要介紹了Golang+Android基于HttpURLConnection實(shí)現(xiàn)的文件上傳功能,結(jié)合具體實(shí)例形式分析了Android基于HttpURLConnection的客戶端結(jié)合Go語(yǔ)言服務(wù)器端實(shí)現(xiàn)文件上傳功能的操作技巧,需要的朋友可以參考下2017-03-03
Android源碼系列之深入理解ImageView的ScaleType屬性
Android源碼系列第一篇,這篇文章主要從源碼的角度深入理解ImageView的ScaleType屬性,感興趣的小伙伴們可以參考一下2016-06-06
Android隱藏標(biāo)題欄及解決啟動(dòng)閃過(guò)標(biāo)題的實(shí)例詳解
這篇文章主要介紹了Android隱藏標(biāo)題欄及解決啟動(dòng)閃過(guò)標(biāo)題的實(shí)例詳解的相關(guān)資料,這里提供兩種方法幫助大家解決這種問(wèn)題,需要的朋友可以參考下2017-09-09
Android RecyclerView實(shí)現(xiàn)點(diǎn)擊條目刪除
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView實(shí)現(xiàn)點(diǎn)擊條目刪除,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android?WebView升級(jí)詳細(xì)操作指南
Android的WebView差異化很嚴(yán)重,下面這篇文章主要給大家介紹了關(guān)于Android?WebView升級(jí)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-07-07
Android項(xiàng)目實(shí)戰(zhàn)之ListView懸浮頭部展現(xiàn)效果實(shí)現(xiàn)
這篇文章主要給大家介紹了Android項(xiàng)目實(shí)戰(zhàn)之ListView懸浮頭部展現(xiàn)效果實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
Android?AccessibilityService?事件分發(fā)原理分析總結(jié)
這篇文章主要介紹了Android?AccessibilityService?事件分發(fā)原理分析總結(jié),AccessibilityService有很多用來(lái)接收外部調(diào)用事件變化的方法,這些方法封裝在內(nèi)部接口Callbacks中,文章圍繞AccessibilityService相關(guān)資料展開(kāi)詳情,需要的朋友可以參考一下2022-06-06
Android xUtils更新到3.0后的基本使用規(guī)則詳解
xUtils是基于android的開(kāi)發(fā)框架,簡(jiǎn)化了很多的開(kāi)發(fā)步驟,可以說(shuō)是非常好的開(kāi)發(fā)工具。下面小編給大家?guī)?lái)了Android xUtils更新到3.0后的基本使用規(guī)則詳解,感興趣的朋友一起學(xué)習(xí)吧2016-08-08
Android開(kāi)發(fā)實(shí)現(xiàn)加載網(wǎng)絡(luò)圖片并下載至本地SdCard的方法
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)加載網(wǎng)絡(luò)圖片并下載至本地SdCard的方法,涉及Android圖片文件的讀取、保存及權(quán)限相關(guān)操作技巧,需要的朋友可以參考下2018-01-01

