flutter開發(fā)中,圖片的引用是必不可少的,所以為了提高效率和精準度,我們需要對不同分辨率的手機使用相對應(yīng)的切圖圖片,本章介紹如何進行 圖片分辨率適配 和 圖片批量拓展處理 。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了順慶免費建站歡迎大家使用!
flutter中會首先根據(jù)系統(tǒng)的devicePixelRatio(每一個邏輯像素包含多少個原始像素,可以通過MediaQueryData.devicePixelRatio來得到)來找對應(yīng)倍數(shù)的文件夾下的圖片,如果沒有對應(yīng)倍數(shù),找最接近的。
所以在flutter項目中,我們需要構(gòu)建對應(yīng)的倍數(shù)像素文件夾
之后再pubspec.yaml中,配置assets文件后就可以使用了(如使用"assets/images/jay.png",會自動適配該像素下最接近的jay圖片)。
使用flutter-img-sync插件批量化處理,具體操作如下
目前還不能處理gif、webp等格式的圖片,而且如果和上邊介紹的不同像素比適配方案一起使用的話,由于進行了精準定位,所以指定圖片后就不能進行像素適配,這是目前還存在的較大問題,所以目前兩者方案只能暫時取一使用。
1、 新版本Flutter SDK 引入了 extension的機制??梢詫δ硞€class 進行擴展。(swift中有類似機制)
2、屏幕適配一直是一個老生常談的問題,隨著機型越來越多,適配的場景也越來越復(fù)雜。
3、之前有了解過 微信小程序的適配方案,個人一直感覺是一個比較好的方式( iPhone6為標準尺寸)下面????將引用小程序的方案來進行對 Flutter的尺寸設(shè)置。
size_fit.dart 文件
double_extension.dart 文件
int_extension.dart 文件
通過上面的設(shè)置,在不同設(shè)備上,展示的widget的尺寸就會不一樣了。
In gradle-wapper.property:
" distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-all.zip"
in build.gradle:
???dependencies{
?? classpath'com.android.tools.build:gradle:7.2.1'
?? classpath"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
參照:;authuser=0#updating-gradle
四大組件中添加?android:exported="true"
當(dāng)我們同時為手機和平板適配編寫 app 針對不同屏幕尺寸進行 UI 布局或當(dāng)用戶偏好設(shè)置較大字號或是想要最大限度等減少動畫等;此時就需要 MediaQuery 來幫我們獲取所用設(shè)備的信息以及用戶設(shè)置的偏好信息;
MediaQuery 一直存在于 WidgetsApp 和 MaterialApp 中, MediaQuery 繼承自 InheritedWidget 是一個單獨的 Widget ,但一般通過 MediaQuery.of(context) 來獲取相關(guān)信息;
當(dāng)相關(guān)信息發(fā)生變化,例如屏幕旋轉(zhuǎn)等時,屏幕中 Widget 會重新構(gòu)建,以保持最新狀態(tài);我們可以通過 MediaQuery 構(gòu)造函數(shù)和提供的靜態(tài)方法手動設(shè)置對應(yīng)的相關(guān)信息;
MediaQueryData 包含關(guān)于媒介的相關(guān)信息;一般通過 MediaQuery.of(context) 獲?。?/p>
size 為媒介的尺寸大小,以邏輯像素為單位;
devicePixelRatio 為像素密度;與設(shè)備物理像素有關(guān),與橫豎屏等無關(guān);
orientation 為橫豎屏, Orientation.landscape 為橫屏, Orientation.portrait 為豎屏;
textScaleFactor 為
每個邏輯像素的字體像素數(shù),小菜理解為字體的像素比;注意,小菜設(shè)置了默認字體像素密度為標準的 1.2 倍之后調(diào)整設(shè)備系統(tǒng)字號,其 1.2 倍依舊是以標準字號為基礎(chǔ)擴大 1.2 倍;
platformBrightness 為當(dāng)前設(shè)備的亮度模式;注意調(diào)整屏幕亮度并不會改變該模式,與當(dāng)前系統(tǒng)支持的黑暗模式和明亮模式相關(guān);
alwaysUse24HourFormat 為當(dāng)前設(shè)備是否為 24 小時制;
accessibleNavigation 為是否使用 TalkBack 或 VoiceOver 之類的輔助功能與應(yīng)用程序進行交互,用以輔助視力障礙人群;
invertColors 為是否使用顏色反轉(zhuǎn),主要用于 iOS 設(shè)備;
highContrast 為用戶是否要求前景與背景之間的對比度高,主要用于 iOS 設(shè)備;
disableAnimations 為平臺是否要求禁用或減少動畫;
boldText 為平臺是否要求使用粗體;
padding 為屏幕內(nèi)邊距,一般是劉海兒屏或異形屏中被系統(tǒng)遮擋部分邊距;
viewInsets 為鍵盤彈出時等遮擋屏幕邊距,其中 viewInsets.bottom 為鍵盤高度;
systemGestureInsets 為手勢邊距,如 Android Q 之后添加的向左滑動關(guān)閉頁面等;
viewPadding 小菜理解為視圖內(nèi)邊距,為屏幕被劉海兒屏或異形屏中被系統(tǒng)遮擋部分,從 MediaQuery 邊界的邊緣計算;此值是保持不變;例如,屏幕底部的軟件鍵盤可能會覆蓋并占用需要底部填充的相同區(qū)域,因此不會影響此值;
physicalDepth 為設(shè)備物理層級,小菜暫時還未想到對應(yīng)的應(yīng)用場景;
小菜在嘗試獲取其他子 Widget Size 時,有兩點需要注意,首先要設(shè)置一個全局的 GlobalKey 來獲取當(dāng)前位置, key 需要為唯一的;第二通過 GlobalKey().currentContext 獲取 BuildContext 上下文環(huán)境,從而獲取對應(yīng)尺寸;
MediaQuery 案例嘗試
小菜對于部分 MediaQueryData 的應(yīng)用和理解還不夠深入;如有錯誤請多多指導(dǎo)!
做移動端開發(fā)的小伙伴都知道,針對不同型號和尺寸的手機要進行頁面適配,且Android和iOS適配方案各不相同,那flutter端如何進行適配呢?以下為近期flutter開發(fā)過程中關(guān)于適配的一些學(xué)習(xí)和記錄~~~~
說到flutter屏幕適配,就不得不提到插件 flutter_screenutil ,提到flutter_screenutil就不得不說以下幾點????
默認寬1080px
默認高1920px
allowFontScaling為false,即不跟隨系統(tǒng)字體大小設(shè)置變化
初始化單位為px
需要把context傳進去,因為內(nèi)部是通過 MediaQuery 來獲取屏幕尺寸等相關(guān)信息的
無需再傳context,因為內(nèi)部是通過單例 window 來獲取屏幕尺寸等相關(guān)信息的
作為iOS開發(fā),之前都是以pt為參照進行比例適配的,且架構(gòu)組已經(jīng)定義了一套適配相關(guān)常量,傳px進去不太方便,所以需要對flutter_screenutil進行擴展
公司設(shè)計圖是以iPhone X的尺寸提供的即物理設(shè)備尺寸為375x812,像素比例為750x1624,像素密度比為2
初始化仍用px來初始化
dart sdk 2.7正式支持 extension-method ,即為已有類擴展方法,從 flutter_screenutil 這種 540.w 寫法點進去,我們可以看到
flutter_screenutil為num類擴展了一系列簡寫方法,那我們當(dāng)然可以按照它這種方式進行擴展
網(wǎng)上提供的解決方案:
第一步:修改 pubspec.yaml
第二步:執(zhí)行 flutter pub get
第三步:重啟 AndroidStudio
解決方案:去掉const即可
UI設(shè)計中px、pt、ppi、dpi、dp、sp之間的關(guān)系
Dart/Flutter - 擴展方法(ExtensionMethod)
同小程序引入 rpx 單位,可以引入 pt 單位與原尺寸相乘即可。下面是個適配的小工具