Flutter应用框架搭建实现屏幕适配方案详解

 更新时间:2022年11月17日 14:01:02   作者:晨晨dyj  
移动设备多样性,特别是Android的碎片化严重,存在各种各样的分辨率,flutter跨平台开发又需要同时支持Android和IOS,为尽可能的还原设计图效果提升用户的体验,根据设计稿设计屏幕ui的时候我们需要考虑到屏幕适配的问题

原理

UI设计的时候一般会按照一个固定的尺寸进行设计,如 360 x 690 ,实际设备分辨率可能是 Google Pixel: 1080 x 1920 、Google Pixel XL: 1440 x 2560 、iPhone 12 Pro Max: 1284 x 2778 等等。开发时如果直接按照设计图写死数值则会出现最后实现的效果跟设计效果不一致的情况。这个时候就可以用比例的方式来进行适配。

将设计图分为固定单位并给这个单位定义一个标识,例如就叫 w,然后通过获取设备分辨率,使用设备真实宽度除以设计图宽度 ,就得到了 1w 代表的真实宽度:

1w = 设备真实宽度 / 设计图宽度

如设计图尺寸是 360 x 690 ,则宽度为 360w ,真实设备宽度为 1080 则 1w = 1080 / 360 = 3

根据上面的算法,得到对应设备的 1w 的真实宽度:

Google Pixel: 1w = 1080 / 360 = 3

Google Pixel XL: 1w = 1440 / 360 = 4

iPhone 12 Pro Max: 1w = 1284 / 360 = 3.57

按照同样的算法,可以给高度定义一个单位为 h , 得出对应设备的高度单位的真实值,如下:

Google Pixel: 1h = 1920 / 690 = 2.78

Google Pixel XL: 1h = 2560 / 690 = 3.71

iPhone 12 Pro Max: 1h = 2778 / 690 = 4.03

得到换算以后 wh 的真实值以后,开发过程中就可以使用其来设置 UI 控件的高、宽、间距等,使其最终呈现的效果无限接近设计图的效果。

开发过程中一般采用宽度来进行适配,控件高度要么自适应,要么也设置宽度的单位,然后整体高度根据内容自适应。但是如果有特殊需求也可以使用高度来进行适配,比如需求要求是 banner 占屏幕的 1/4 ,或者要求内容刚好一屏显示,这个时候设置控件的高度时就可以采用高度单位来进行适配。

基于上面的算法,在项目中就可以实现对应的适配方案了,但本着不重复造轮子的思想,项目开发中可以直接使用 flutter_screenutil 这个适配库。

推荐方法

直接使用ScreenUtil.init方法,传入屏幕尺寸、设计图尺寸和屏幕方向可以对flutter_screenutil进行初始化,代码如下:

ScreenUtil.init(
  BoxConstraints(
    maxWidth: MediaQuery.of(context).size.width,  //屏幕宽度
    maxHeight: MediaQuery.of(context).size.height, //屏幕高度
  ),
  designSize: const Size(360, 690), // 设计图尺寸
  orientation: Orientation.portrait); // 屏幕方向
)

使用这种方式只需要在使用flutter_screenutil前进行初始化即可,一般放在根路由即第一个页面加载的时候进行初始化。

注意:ScreenUtil.init不能够在MyApp中进行初始化,此时还没有加载MaterialApp无法使用MediaQuery.of(context)获取到屏幕的宽高。

初始化以后就可以使用flutter_screenutil提供的方法获取到适配后的数值进行使用了。

可以通过如下的api获取宽高以及字体的适配数值。

ScreenUtil().setWidth(540)  //根据屏幕宽度适配尺寸
ScreenUtil().setHeight(200) //根据屏幕高度适配尺寸(一般根据宽度适配即可)
ScreenUtil().radius(200)    //根据宽度或高度中的较小者进行调整
ScreenUtil().setSp(24)      //字体大小适配

传入的参数即为设计图上的大小。在实际使用中的示例如下:

Container(
  width: ScreenUtil().setWidth(200),
  height: ScreenUtil().setHeight(540),
  child: Text("Hello", style: TextStyle(fontSize: ScreenUtil().setSp(24)),),
);

flutter_screenutil更简单的写法,使用dart扩展的num类型:

上面的每一个方法和下面的相对应:

ScreenUtil().setWidth(540)  =>  540.h
ScreenUtil().setHeight(200) =>  200.w
ScreenUtil().radius(200)    =>  200.r
ScreenUtil().setSp(24)      =>  24.sp

相应的修改之后的使用示例:

Container(
width: 200.w,
height: 540.h,
child: Text("Hello", style: TextStyle(fontSize: 24.sp),),
);

注意:1.w!=1.h除非屏幕的分辨率比例和设计图的比例一致,所以要设置正方形,切记使用相同的单位,如果设置相同的w和h,可能是长方形。

除了上面的4钟扩展属性以外,还提供了sm以及sw和sh

sm:取数值本身和sp的值较小的值,如:12.sm则取12和12.sp的值进行比较,取较小的值。

sw:screen width的缩写,表示的是屏幕宽度,作用是按照屏幕宽度比例返回值。如0.2sw则返回屏幕宽度的20%,1.sw则是整个屏幕宽度

sh:screen height的缩写,即屏幕高度,作用于sw类似,返回指定比例的屏幕高度值。如1.sh为整个屏幕的高度。

使用sp作为字体单位,默认是会随着系统字体缩放进行变化的,如果不想让字体随着系统的缩放进行变化,可以设置textScaleFactor为1.0来实现。项目中可对MaterialApp进行全局设置,或者对Text进行单独的设置。

全局设置:

MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter_ScreenUtil',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        builder: (context, widget) {
          return MediaQuery(
            ///设置文字大小不随系统设置改变
            data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
            child: widget,
          );
        },
        home: HomePage(title: 'FlutterScreenUtil Demo'),
      ),

单独设置:

Text("text", textScaleFactor: 1.0)

到此这篇关于Flutter应用框架搭建实现屏幕适配方案详解的文章就介绍到这了,更多相关Flutter屏幕适配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android调用google地图生成路线图实现代码

    Android调用google地图生成路线图实现代码

    Android程序调用本机google地图并且传递起始和终点位置生成路线图,有需要的朋有可以参考下,或许本文对你有所帮助,好了话不多说,看代码
    2013-02-02
  • Android中通知Notification的使用方法

    Android中通知Notification的使用方法

    这篇文章主要为大家详细介绍了Android中通知Notification的使用方法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android编程之SurfaceView学习示例详解

    Android编程之SurfaceView学习示例详解

    这篇文章主要介绍了Android编程之SurfaceView学习示例,结合实例分析了SurfaceView的功能、使用方法与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • OkHttp3中默认不保持Cookie的解决方法

    OkHttp3中默认不保持Cookie的解决方法

    这篇文章主要给大家介绍了关于OkHttp3中默认不保持Cookie的解决方法,文中先对OKhttp3中的cookies进行了简单的介绍,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • android里TextView加下划线的几种方法总结

    android里TextView加下划线的几种方法总结

    下面小编就为大家带来一篇android里TextView加下划线的几种方法总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 一文带你了解Android系统的启动流程

    一文带你了解Android系统的启动流程

    Android系统的启动是一个复杂的过程,涉及到多个阶段和组件,所以本文将给大家详细的介绍一下Android系统的启动流程,文中也有图片和代码示例的讲解,需要的朋友可以参考下
    2023-09-09
  • Android CameraX打开摄像头预览教程

    Android CameraX打开摄像头预览教程

    大家好,本篇文章主要讲的是Android CameraX打开摄像头预览教程,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • android自定义view制作圆形进度条效果

    android自定义view制作圆形进度条效果

    这篇文章主要为大家详细介绍了android自定义view制作圆形进度条效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android之开发消息通知栏

    Android之开发消息通知栏

    本文主要介绍了Android开发消息通知栏的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • Android中使用ShareSDK集成分享功能的实例代码

    Android中使用ShareSDK集成分享功能的实例代码

    下面小编就为大家分享一篇Android中使用ShareSDK集成分享功能的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论