Flutter 屏幕適配

一逛尚、概述

對于Flutter開發(fā)來說鹏倘,除了需要滿足Android和IOS風(fēng)格樣式之外,我們首先需要考慮的就是開發(fā)出原型圖設(shè)計的樣式效果嘹害,所以我們首先要做的就是屏幕適配撮竿。

二、原理

參照flutter_screenUtil的原理設(shè)置吼拥,我們需要做的就是在每一臺設(shè)備上把原型圖上的尺寸等比例放大縮小就可以了倚聚,所以基本的設(shè)計原理就是:
開發(fā)尺寸/原型圖尺寸=實際屏幕寬度/原型圖屏幕寬度

三、實現(xiàn)

首先獲取必須的數(shù)據(jù)

    static const double _defaultWidth = 750;  // UI 設(shè)計圖的寬度
    static const double _defaultHeight = 1334; // UI 設(shè)計圖的高度
    _mediaQueryData = MediaQuery.of(context);
    _screenWidth = _mediaQueryData.size.width;//屏幕實際寬度
    _screenHeight = _mediaQueryData.size.height;//屏幕實際高度
    _pixelRatio = _mediaQueryData.devicePixelRatio;//屏幕像素
    _rpx = _screenWidth / _defaultWidth;
    static num setPx(num size) => _rpx * size;

這樣最基本的設(shè)計思想就實現(xiàn)了凿可。

四惑折、擴展

除了等比例設(shè)計外授账,我們還可以通過設(shè)備像素來定義寬度百分比、長度百分比單位等惨驶,意思字體大小的設(shè)計(字體大小與原型圖設(shè)計之間的轉(zhuǎn)換不能單純等比例設(shè)計)白热,代碼如下:

import 'package:flutter/material.dart';

class SizeUtil {
  SizeUtil._();

  static MediaQueryData _mediaQueryData;

  /// UI 設(shè)計圖的寬度
  static const double _defaultWidth = 750;

  /// UI 設(shè)計圖的高度
  static const double _defaultHeight = 1334;

  static num _uiWidthPx;
  static num _uiHeightPx;

  /// 屏幕寬度(dp)
  static double _screenWidth;

  /// 屏幕高度(dp)
  static double _screenHeight;

  /// 設(shè)備像素密度
  static double _pixelRatio;

  /// 控制字體是否要根據(jù)系統(tǒng)的“字體大小”輔助選項來進(jìn)行縮放。默認(rèn)值為false粗卜。
  static double _textScaleFactor;

  static bool _allowFontScaling;

  static double _px;

  static double _rpx;

  static void initialize(BuildContext context,
      {double standardWidth = _defaultWidth,
      double standardHeight = _defaultHeight,
      bool allowFontScaling = false}) {
    _uiWidthPx = standardWidth;
    _uiHeightPx = standardHeight;

    _mediaQueryData = MediaQuery.of(context);
    _screenWidth = _mediaQueryData.size.width;
    _screenHeight = _mediaQueryData.size.height;

    _pixelRatio = _mediaQueryData.devicePixelRatio;

    _textScaleFactor = _mediaQueryData.textScaleFactor;

    _allowFontScaling = allowFontScaling;
    _rpx = _screenWidth / _uiWidthPx;
    _px= _screenHeight / _uiHeightPx * 2;
  }

  /// 每個邏輯像素的字體像素數(shù)屋确,字體的縮放比例
  static double get textScaleFactor => _textScaleFactor;

  static double get pixelRatio => _pixelRatio;

  static double get screenWidth => _screenWidth;

  static double get screenHeight => _screenHeight;

  /// 設(shè)備寬度 px
  static double get screenWidthPx => _screenWidth * _pixelRatio;

  /// 設(shè)備高度 px
  static double get screenHeightPx => _screenHeight * _pixelRatio;

  /// 實際的dp與UI設(shè)計px的比例
  static double get scaleWidth => _screenWidth / _uiWidthPx;

  static double get scaleHeight => _screenHeight / _uiHeightPx;

  static double get scaleText => scaleWidth;

  static num setPx(num size) => _rpx * size * 2;//原型圖像素為*2,所以這里需要擴大2倍

  static num setRpx(num size) => _px * size;

  static num setWidth(num size) => size * scaleWidth;

  static num setHeight(num size) => size * scaleHeight;

  static num setSp(num size, {bool allowFontScalingSelf}) =>
      allowFontScalingSelf == null
          ? (_allowFontScaling
              ? (size * scaleText)
              : ((size * scaleText) / _textScaleFactor))
          : (allowFontScalingSelf
              ? (size * scaleText)
              : ((size * scaleText) / _textScaleFactor));

  static num setWidthPercent(int percent) => (_screenWidth * percent) / 100;

  static num setHeightPercent(int percent) => (_screenHeight * percent) / 100;
}

extension NumExtensions on num {
  num get px => SizeUtil.setPx(this);

  num get rpx => SizeUtil.setRpx(this);

  num get w => SizeUtil.setWidth(this);

  num get h => SizeUtil.setHeight(this);

  num get sp => SizeUtil.setSp(this, allowFontScalingSelf: false);

  num get asp => SizeUtil.setSp(this, allowFontScalingSelf: true);

  num get wp => SizeUtil.setWidthPercent(this);

  num get hp => SizeUtil.setHeightPercent(this);
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末续扔,一起剝皮案震驚了整個濱河市攻臀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纱昧,老刑警劉巖刨啸,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異识脆,居然都是意外死亡设联,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門灼捂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來离例,“玉大人,你說我怎么就攤上這事悉稠」” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵偎球,是天一觀的道長洒扎。 經(jīng)常有香客問我,道長衰絮,這世上最難降的妖魔是什么袍冷? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮猫牡,結(jié)果婚禮上胡诗,老公的妹妹穿的比我還像新娘。我一直安慰自己淌友,他們只是感情好煌恢,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著震庭,像睡著了一般瑰抵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上器联,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天二汛,我揣著相機與錄音婿崭,去河邊找鬼。 笑死肴颊,一個胖子當(dāng)著我的面吹牛氓栈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播婿着,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼授瘦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竟宋?” 一聲冷哼從身側(cè)響起提完,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袜硫,沒想到半個月后氯葬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挡篓,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡婉陷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了官研。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽澳。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戏羽,靈堂內(nèi)的尸體忽然破棺而出担神,到底是詐尸還是另有隱情,我是刑警寧澤始花,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布妄讯,位于F島的核電站,受9級特大地震影響酷宵,放射性物質(zhì)發(fā)生泄漏亥贸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一浇垦、第九天 我趴在偏房一處隱蔽的房頂上張望炕置。 院中可真熱鬧,春花似錦男韧、人聲如沸朴摊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甚纲。三九已至,卻和暖如春朦前,著一層夾襖步出監(jiān)牢的瞬間介杆,已是汗流浹背讹弯。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留这溅,地道東北人组民。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像悲靴,于是被迫代替她去往敵國和親臭胜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345