国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flutter屏幕適配的三種方案

這篇具有很好參考價(jià)值的文章主要介紹了Flutter屏幕適配的三種方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

做移動(dòng)端開發(fā)的同學(xué)都知道,針對(duì)不同型號(hào)和尺寸的手機(jī)要進(jìn)行頁面的適配,且 iOS 和 Android 適配方案各不相同,那我們用 Flutter 開發(fā)要怎么處理屏幕適配呢?

Flutter中的單位

Flutter使用的是類似于iOS中的點(diǎn)pt,也就是point。我們經(jīng)常說 iPhone8 的尺寸是375x667,但是它的分辨率其實(shí)是 750x1334 。因?yàn)閕Phone8的像素比(devicePixelRatio)是2.0,iPhone8plus的像素比是3.0。

iPhone各型號(hào)設(shè)備的尺寸

Flutter屏幕適配的三種方案

Flutter 中獲取設(shè)備信息

獲取設(shè)備相關(guān)的信息,可以使用官方提供的一個(gè)庫

device_info: ^2.0.3
//獲取設(shè)備的信息
Future getDeviceInfo() async{
  DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
  var dataInfo;
  //判斷是iOS平臺(tái)還是Android平臺(tái)
  //IosDeviceInfo里面包含我們常用到的設(shè)備信息
  if(Platform.isIOS) {
    print('IOS設(shè)備:');
    IosDeviceInfo iosInfo = await deviceInfo.iosInfo;dataInfo = iosInfo;
  } else if(Platform.isAndroid) {
    print('Android設(shè)備');
    AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;dataInfo = androidInfo;
  }
  return dataInfo;
}

獲取屏幕的尺寸

需要引入

import'dart:ui';

獲取屏幕的寬高、劉海高度、分辨率等信息

// 1.媒體查詢信息final mediaQueryData = MediaQuery.of(context);

// 2.獲取寬度和高度final screenWidth = mediaQueryData.size.width;
final screenHeight = mediaQueryData.size.height;
final physicalWidth = window.physicalSize.width;
final physicalHeight = window.physicalSize.height;
final dpr = window.devicePixelRatio;

// 3.狀態(tài)欄的高度// 有劉海的屏幕:44 沒有劉海的屏幕為20final statusBarHeight = mediaQueryData.padding.top;
// 有劉海的屏幕:34 沒有劉海的屏幕0final bottomHeight = mediaQueryData.padding.bottom;
print('屏幕width:$screenWidth height:$screenHeight');
print('分辨率: $physicalWidth * $physicalHeight');
print('像素比: $dpr');
print('狀態(tài)欄height: $statusBarHeight 底部高度:$bottomHeight');

打印出的設(shè)備尺寸

Performing hot restart...
Syncing files to device iPhone 12 Pro...
Restarted application in 575ms.
flutter: 屏幕width:390.0 height:844.0
flutter: 分辨率: 1170.0 * 2532.0
flutter: 像素比: 3.0
flutter: 狀態(tài)欄height: 47.0 底部高度:34.0

適配方案

1.通過等比換算的方式

計(jì)算公式:實(shí)際尺寸 = UI尺寸 * 設(shè)備寬度/設(shè)計(jì)圖寬度

這里封裝了一個(gè)類Adapt,通過類可以獲取屏幕的信息

class Adapt {
  
  static double screenWidth = 0;
  static double screenHeight = 0;
  static double physicalWidth = 0;
  static double physicalHeight = 0;
  static double dpr = 0;
  static double ratio = 1.0;
  static double statusBarHeight = 0;
  static double bottomHeight = 0;

  static void initialize(BuildContext context, {double UIWidth = 375}) {
    // 1.媒體查詢信息
    final mediaQueryData = MediaQuery.of(context);

    // 2.獲取寬度和高度
    screenWidth = mediaQueryData.size.width;screenHeight = mediaQueryData.size.height;physicalWidth = window.physicalSize.width;physicalHeight = window.physicalSize.height;
    //像素比
    dpr = window.devicePixelRatio;

    // 3.狀態(tài)欄的高度
    // 頂部有劉海:47pt 沒有劉海的屏幕為20pt
    statusBarHeight = mediaQueryData.padding.top;
    // 底部有劉海:34pt 沒有劉海的屏幕0pt
    bottomHeight = mediaQueryData.padding.bottom;
    //比例
    ratio = screenWidth/UIWidth;
  }

  static pt(size){
    return size * Adapt.ratio;
  }
}
示例代碼

UI給出的設(shè)計(jì)稿的尺寸是375*667,定義一個(gè)大小為(300*300)pt的盒子,盒子中顯示字體大小為30pt的文字

@override
Widget build(BuildContext context) {
  Adapt.initialize(context);
  returnScaffold(
    appBar: AppBar(
      title: const Text('屏幕適配'),
    ),
    body: Center(
      child: Container(
        width: Adapt.pt(300),
        height: Adapt.pt(300),
        color: Colors.orange,
        alignment: Alignment.center,
        child: Text(
          'Hello Word',
          style: TextStyle(fontSize: Adapt.pt(30)),
          textAlign: TextAlign.center,
        ),
      ),
    ),
  );
}

運(yùn)行效果圖,明顯右邊做適配的更符合效果

Flutter屏幕適配的三種方案

2. rpx方案適配

rpx是小程序中的適配方案,它將750px作為設(shè)計(jì)稿,1rpx=屏幕寬度/750,其它所有的單位都使用rpx單位。

  • 不管是什么屏幕,統(tǒng)一分成750份

  • 在iPhone8上: 1rpx = 375/750 = 0.5px

  • 在iPhone12proMax 上:1rpx = 428/750 = 0.571px

所以我們就可以通過上面的計(jì)算方式,算出一個(gè)rpx,再將自己的size和rpx單位相乘即可:比如300px的寬度:3002rpx

  • 在iPhone8上計(jì)算出的結(jié)果是300px

  • 在在iPhone12proMax上計(jì)算出的結(jié)果是342.6px通過計(jì)算可以看出,還是有明顯數(shù)據(jù)上的差別的。

這里也是封裝一個(gè)類 Adapt,直接可以獲取屏幕的信息

class Adapt {
  static MediaQueryData _mediaQueryData = MediaQueryData();
  static double screenWidth = 0;
  static double screenHeight = 0;
  static double rpx = 0;
  static double px = 0;

  static void initialize(BuildContext context, {double standardWidth = 750}) {
    _mediaQueryData = MediaQuery.of(context);screenWidth = _mediaQueryData.size.width;screenHeight = _mediaQueryData.size.height;rpx = screenWidth / standardWidth;px = screenWidth / standardWidth * 2;
  }

  // 按照像素來設(shè)置
  static double setPx(double size) {
    return Adapt.rpx * size * 2;
  }

  // 按照rxp來設(shè)置
  static double setRpx(double size) {
    return Adapt.rpx * size;
  }
}
示例代碼

和上面的需求是一樣的,最后適配的效果是一樣的

@override
Widget build(BuildContext context) {
  Adapt.initialize(context);
  returnScaffold(
    appBar: AppBar(
      title: const Text('屏幕適配'),
    ),
    body: Center(
      child: Container(
        width: Adapt.setPx(300),
        height: Adapt.setPx(300),
        color: Colors.orange,
        alignment: Alignment.center,
        child: Text(
          'Hello Word',
          style: TextStyle(fontSize: Adapt.setPx(30)),
          textAlign: TextAlign.center,
        ),
      ),
    ),
  );
}
Flutter屏幕適配的三種方案

注意:一定要在已經(jīng)有 MaterialApp 的 Widget 中使用 context ,否則是無效的。我這里定義默認(rèn)效果圖的尺寸是 375*667,這里是可以自定義傳入效果圖的寬度的。

3. flutter_screenutil 插件

  • pubspec.yaml中引入

flutter_screenutil: ^5.0.1
  • 在已經(jīng)有 MaterialApp 的 Widget 中使用 context 進(jìn)行初始化

ScreenUtil.init(context,width:750,height:1334,allowFontScaling:false);
示例代碼
Container(
   width: ScreenUtil().setWidth(300),
   height: ScreenUtil().setHeight(300)
 }
Text(
  'Hello Word',
  style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(30)),
  textAlign: TextAlign.center,
)

其他更多用法可以參考官網(wǎng)文檔:pub.flutter-io.cn/packages/fl…文章來源地址http://www.zghlxwxcb.cn/news/detail-462243.html

到了這里,關(guān)于Flutter屏幕適配的三種方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • flutter-移動(dòng)端適配

    不同屏幕之間的尺寸適配 使用插件?flutter_screenutil flutter 屏幕適配方案,用于調(diào)整屏幕和字體大小的flutter插件,讓你的UI在不同尺寸的屏幕上都能顯示合理的布局! 安裝 # add flutter_screenutil flutter_screenutil: ^5.8.4

    2024年02月12日
    瀏覽(18)
  • Flutter:引領(lǐng)移動(dòng)開發(fā)新潮流,跨平臺(tái)應(yīng)用程序的終極解決方案

    Flutter:引領(lǐng)移動(dòng)開發(fā)新潮流,跨平臺(tái)應(yīng)用程序的終極解決方案

    Flutter是由Google開發(fā)的一款開源移動(dòng)應(yīng)用開發(fā)框架,它可以幫助開發(fā)者快速高效地構(gòu)建跨平臺(tái)的移動(dòng)應(yīng)用程序。Flutter基于Dart編程語言,具有簡單易學(xué)、高效靈活的特點(diǎn),并且可以與現(xiàn)有的Android和iOS應(yīng)用進(jìn)行集成。本文將介紹Flutter的基本概念、開發(fā)環(huán)境搭建、基礎(chǔ)組件、生命

    2024年02月04日
    瀏覽(111)
  • Android之屏幕適配方案

    Android之屏幕適配方案

    在說明適配方案之前,我們需要對(duì)如下幾個(gè)概念有所了解:屏幕尺寸,屏幕分辨率,屏幕像素密度。 屏幕尺寸 屏幕尺寸指屏幕的對(duì)角線的物理長度,單位是英寸,1英寸=2.54厘米。 比如常見的屏幕尺寸:5.0、5.99、6.0等等 屏幕分辨率 屏幕分辨率是指手機(jī)在橫向、縱向上的像素

    2024年02月03日
    瀏覽(24)
  • Redis的三種部署方案

    Redis的三種部署方案

    在Redis中提供的集群方案總共有三種:單機(jī)模式,主從復(fù)制集群、哨兵模式,Redis分片集群 Redis 只運(yùn)行在一臺(tái)服務(wù)器上,并且所有的數(shù)據(jù)都存儲(chǔ)在這一臺(tái)服務(wù)器的內(nèi)存中。 搭建主從復(fù)制集群解決的是高并發(fā)讀問題。 單個(gè)Redis節(jié)點(diǎn)的并發(fā)能力有限,要進(jìn)一步提高Redis的并發(fā)能力

    2024年04月10日
    瀏覽(25)
  • 微信小程序適配問題 移動(dòng)端適配方案 viewport

    iPhone X 兼容 在小程序頁面開發(fā)中,涉及到需要適配 iPhone X 的地方主要有:導(dǎo)航欄(NavigationBar),標(biāo)簽欄(TabBar)以及頁面底部的吸底按鈕。 對(duì)于position: fixed的可交互組件,如果渲染在iPhone X的安全區(qū)域外,容易誤觸 Home Indicator,應(yīng)當(dāng)把可交互的部分都渲染到安全區(qū)域內(nèi)。

    2024年02月12日
    瀏覽(23)
  • Flutter筆記:發(fā)布一個(gè)模塊 scale_design - (移動(dòng)端)設(shè)計(jì)師尺寸適配工具

    Flutter筆記:發(fā)布一個(gè)模塊 scale_design - (移動(dòng)端)設(shè)計(jì)師尺寸適配工具

    Flutter筆記 發(fā)布一個(gè)模塊scale_design 設(shè)計(jì)師尺寸適配工具與常用組件庫 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 郵箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/134210226 模塊地址 :https://pub.dev/packages/scale_design 倉庫地址 :https://github.com/jack

    2024年02月05日
    瀏覽(24)
  • 恒流電路的三種設(shè)計(jì)方案

    恒流電路的三種設(shè)計(jì)方案

    作為硬件研發(fā)工程師相信對(duì)恒流電路不會(huì)陌生,本文介紹下三種恒流電路的原理圖。 三極管恒流電路 三極管恒流電路 ????三極管的恒流電路,主要是利用Q2三極管的基級(jí)導(dǎo)通電壓為0.6~0.7V這個(gè)特性;當(dāng)Q2三極管導(dǎo)通,Q1三極管基級(jí)電壓被拉低而截止,負(fù)載R1不工作;負(fù)載R1流

    2024年02月11日
    瀏覽(22)
  • iOS 組件化的三種方案

    iOS 組件化的三種方案

    本文主要介紹iOS組件化的三種方案 URL Scheme Target - Action Protocol - Class 匹配 1.1、?URL Scheme路由 使 URL 處理本地的跳轉(zhuǎn) 通過中間層進(jìn)?注冊(cè) 調(diào)? (load方法里把被調(diào)用者注冊(cè)到中間層) 注冊(cè)表?需使用反射 非懶加載 / 注冊(cè)表的維護(hù) / 參數(shù) URL Scheme路由示例? 參考了系統(tǒng)URL Schem

    2024年02月12日
    瀏覽(16)
  • 微信小程序之scroll-view自適配屏幕高度解決方案

    微信小程序之scroll-view自適配屏幕高度解決方案

    需求說明: 一般用于列表數(shù)據(jù)的展示(帶有搜索框),根據(jù)官方文檔,scroll-view需要固定一個(gè)高度,那么,對(duì)于不同的手機(jī)分辨率來說,可能顯示的效果就不一樣了,有的沒到底,有的顯示不全等等 解決方案: ? 不同的手機(jī),但是可以通過計(jì)算,獲取到scroll-view的填充高度。

    2024年02月12日
    瀏覽(26)
  • pc端與移動(dòng)端適配 解決方案

    pc端與移動(dòng)端適配 解決方案

    一般網(wǎng)站實(shí)現(xiàn)pc端與移動(dòng)端適配的需求,方案有兩個(gè): 1、一套頁面,從設(shè)計(jì)時(shí)就考慮到跨設(shè)備適配,響應(yīng)式的一步到位; 2、開發(fā)兩套頁面,根據(jù)設(shè)備尺寸加載加載不同的資源,目前已經(jīng)不常見了; 做一個(gè)響應(yīng)式的頁面。即只用一個(gè)鏈接,用媒體查詢來控制樣式。同一個(gè)鏈接

    2024年02月04日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包