Flutter屏幕适配

发布于:2022-10-22 ⋅ 阅读:(529) ⋅ 点赞:(0)

Flutter屏幕适配

一、Flutter中的单位

1.1. 点-points

在刚开始,所有的图形位置都由坐标点指定。

点事抽象的单位,它们只在逻辑坐标系上有意义。

  • 在进行Flutter开发时,我们通常不需要传入尺寸的单位,就像下边这种。
Scaffold(
      appBar: AppBar(
        title: Text("首页"),
      ),
      body: Center(
        child: Container(
          width: 400,
          height: 400,
          color: Colors.red,
          alignment: Alignment.center,
          child: Text("Hello World", style: TextStyle(fontSize: 20),),
        ),
      ),
    );

没有传入单位,此时其实用的是单位是pt,也就是point,点的概念。

  • 拿iphone6 举例子常说iPhone6 的尺寸是 375x667 这个就是点的概念
1.2. 像素-pixels

我们说iPhone6 的物理像素 ,有的也叫分辨率 是 750x1334 ,这个指的是像素pixel,单位是px,UI设计出的图,单位就可能是px值。

1.3. 设备像素比-devicePixelRatio

我们说iPhone6 的 devicePixelRatio 等于2,这是怎么来的呢?
d e v i c e P i x e l R a t i o = 物理像素( p x 值) 点 devicePixelRatio = \frac{物理像素(px值)}{点} devicePixelRatio=物理像素(px值)

i p h o n e 6 的 d e v i c e P i x e l R a t i o : 2 = 750 ( 分辨率 ) 375 ( 尺寸点 ) iphone6 的devicePixelRatio: 2 = \frac{750(分辨率)}{375(尺寸点)} iphone6devicePixelRatio2=375(尺寸点)750(分辨率)

在Flutter中可以通过 window 来获取

   // 1.手机的物理分辨率
    physicalWidth = window.physicalSize.width;
    physicalHeight = window.physicalSize.height;

    // 2.获取dpr 直接拿到比值
    dpr = window.devicePixelRatio;

    // 3.宽度和高度
    screenWidth = physicalWidth / dpr;
    screenHeight = physicalHeight / dpr;

网站找到一张很详细的图,可以参考:

在这里插入图片描述

二、适配方案

2.1 rpx 适配

参考王红元老师的讲解:

  • 不管是什么屏幕,统一分成750份
  • 在iPhone5上:1rpx = 320/750 = 0.4266 ≈ 0.42px
  • 在iPhone6上:1rpx = 375/750 = 0.5px
  • 在iPhone6plus上:1rpx = 414/750 = 0.552px
设备 rpx换算px (屏幕宽度/750) px换算rpx (750/屏幕宽度)
iPhone5 1rpx = 0.42px 1px = 2.34rpx
iPhone6 1rpx = 0.5px 1px = 2rpx
iPhone6 Plus 1rpx = 0.552px 1px = 1.81rpx

由此可以封装工具类:

完整代码如下:

import 'dart:ui';

class SizeFit {
  // 1.基本信息
  static double physicalWidth;
  static double physicalHeight;
  static double screenWidth;
  static double screenHeight;
  static double dpr;
  static double statusHeight;

  static double rpx;
  static double px;

  //iphone6 为基准 375的屏幕宽度  物理像素是750
  
  static void initialize({double standardSize = 750}) {
    // 1.手机的物理分辨率
    physicalWidth = window.physicalSize.width;
    physicalHeight = window.physicalSize.height;

    // 2.获取dpr
    dpr = window.devicePixelRatio;

    // 3.宽度和高度
    screenWidth = physicalWidth / dpr;
    screenHeight = physicalHeight / dpr;

    // 4.状态栏高度
    statusHeight = window.padding.top / dpr;

    // 5.计算rpx的大小
    rpx = screenWidth / standardSize;
    px = screenWidth / standardSize * 2;
  }

  //参考设计稿对应的是750 ,直接用这个
  static double setRpx(double size) {
    return rpx * size;
  }

  //参考设计稿对应的是375 ,直接用这个
  static double setPx(double size) {
    return px * size;
  }
}

在使用时必须初始化 调用

SizeFit.initialize()//默认的标准宽度是 750  可以根据UI设计稿更改

在使用时候选择调用

setRpx(double size) 或者  setPx(double size) 
2.2 flutter_screenutil

屏幕适配也可以使用第三方库:flutter_screenutil

地址:https://github.com/OpenFlutter/flutter_screenutil

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到