Flutter屏幕适配之一:采用与UI图等比例显示的方案,实现屏幕大小尺寸的适配

在Flutter中,我们设置尺寸的时候都是double型的数量,不能设置单位,这是因为flutter默认是使用logical pixel逻辑像素的,系统拿到我们设的值,会自动判断在iOS或者Android上对应的尺寸,不用我们强制转换成某一个单位。

所以,我们现在要想的就是,这个值,我们应该设置成多少。

在这里,我用实现控件尺寸与屏幕上固定尺寸(宽度、状态栏高度)的比例与UI图上相同的适配方案。

Flutter中有一个类叫做 MediaQueryData,通过这个类可以拿到屏幕上的某些尺寸,还有一些别的属性,大家感兴趣可以自己去研究下,我这里只列出来这篇文章中用到的:

    MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window);
    var w=mediaQuery.size.width;//屏幕宽度
    var h=mediaQuery.size.height;//屏幕高度
    var scale =mediaQuery.devicePixelRatio;//每一个逻辑像素包含多少个原始像素
    var statusBar=mediaQuery.padding.top;//状态栏高度

现在我们来实现。

UI给的设计图,整个页面的宽度是750,状态栏高度是40,标题栏高度是88,标题title文字大小是32。

我的思路是,看看flutter中的几个单位长度相当于设计图中1个单位长度,算出这个比例,直接乘以UI给的尺寸,就是flutter中应该设置的大小

已知:UI图中屏幕宽度是750,Flutter中MediaQueryData得到的屏幕宽度是w(这个宽度不同的设备上可能不一样,拿到多少就是多少)。

假设flutter中unit个单位长度相当于设计图中1个单位长度,
那么, \frac{unit}{1}=\frac{w}{750} 。

代码实现:

static double unit = w/ 750.0;

然后根据UI图给出的控件尺寸,换算出对应的大小。

///常用尺寸
class Sizes {

  //省略.....

  static double size36 = 36 * unit;
  static double size32 = 32 * unit;
  static double size30 = 30 * unit;

}

使用:

TextStyle(fontSize: Sizes.size32),

以小米MIX为例,得到的w为360,则unit为0.48。于是,设计图上的32px,在flutter中设置的值为size32就是32*0.48=15.36,当然了,这个过程不用我们自己算,这个值也不是固定的,系统算出来多少就是多少,我只是说这个意思。

然后来单独设置标题栏高度。因为UI给的图中,状态栏与屏幕宽度的比例与实际手机的比例有些不同,所以单独来保证状态栏与标题栏的比例与UI一致。

假设flutter中标题栏高度是b,状态栏高度由上面的方法得到是statusBar。

那么:\frac{statusBar}{b} = \frac{40}{88}b=\frac{88}{40}*statusBar

代码中实现:

static double sizeTitleBar = 88 / 40 * statusBar;

使用:

final double height = Sizes.sizeTitleBar;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值