当前位置: 首页 > news >正文

第一百一十一回 如何实现屏幕适配

文章目录

  • 概念介绍
  • 实现方法
  • 示例代码

我们在上一章回中介绍了动画相关的内容,本章回中将介绍 如何适配屏幕.闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们平常使用的手机屏幕大小不同,App运行在这些大小不同的屏幕上时效果却相同,其原因就是App对不同大小的屏幕做了适配。因此我们把程序中对不同屏幕大小做处理的操作叫作适配。

适配是移动开发中必不可少的内容,在Android和IOS原生开发中需要做适配,Flutter做为跨端开发的框架,也需要做适配工作。本章回中将介绍在Flutter开发中如何去适配大小不同的屏幕。

实现方法

适配的核心思想是把相同的尺寸乘以一定的比率,使得该尺寸在不同大小的屏幕上占用的屏幕空间相同,这样给人的感觉就是这个尺寸到不同大小的屏幕上看着都一样。

我们举例子来说明:80dp在480*720大小的屏幕上占用1/6屏幕宽度。在240*320大小的屏幕上如果想占用1/6宽度,那么需要40dp.此时就需要让80dp乘以比率0.5才通满足条件。依次类推,在720*960大小的屏幕上如果想占用1/6宽度就120dp,此时就需要让80乘以比率1.5才能满足条件。

适配的思想介绍完了,那么如何计算不同屏幕的比率呢?常用做法是选一个基准值,屏幕的宽度除以基准值就是比率,在App的UI设计中通常以iPone6的屏幕尺寸为基准,它的屏幕尺寸是一个中间尺寸,有比它小的屏幕也有比它大的屏幕,选用这个尺寸大小可以方便适配其它尺寸的屏幕。

iPhone6实际宽度375 * 667,单位是pt,分辨率:750 * 1334,单位是px。为什么是屏幕宽度呢?因为手机屏幕的宽度比长度小,所以通常以宽度和高度中的最小值来适配。

因此我们可以得到比率公式:屏幕比率=屏幕分辨率宽度/750. 750是iPhone6的屏幕宽度,也可以换成UI设计稿中的尺寸,通常设计稿件中的尺寸都是像素,因此这里使用750为基准值,如果设计
稿不以这个尺寸为基准值,那么把750换成设计稿中的尺寸就可以。

示例代码

///自己设计的屏幕适配类,转换单位为dp
class XScreenUtil {static double baseSize = 0;static double physicalWidth = 0;static double physicalHeight = 0;static double realWidth = 0;static double realHeight = 0;static double dpr = 0;static double statusBarHeight = 0;///计算好的屏幕比率static double fitRatio = 0;///计算好的屏幕比率,单位为像素static double fitRatioPx = 0;///pt类似dp,ios中的屏幕单位point的缩写,px是像素缩小,在设计中使用广泛///baseSize以iPhone6为基准,默认值是750px,375dpstatic void init(BuildContext context,[baseSize=375]) {///获取屏幕物理分辨率,单位是pxphysicalWidth = View.of(context).physicalGeometry.width;physicalHeight = View.of(context).physicalGeometry.height;///获取屏幕物理分辨率,单位是ptrealWidth = MediaQuery.of(context).size.width;realHeight = MediaQuery.of(context).size.height;///屏幕的比率,比如2x,3xdpr = View.of(context).devicePixelRatio;///状态栏的高度,除以dpr才是屏幕中实际的的高度statusBarHeight = MediaQuery.of(context).padding.top / dpr;///屏幕适配时以宽度为单位进行适合,screenutil包中分宽度和高度两种适配方式,w为宽度,h为度,ex200.w,200.h.///实际项目中以宽度和高度中数值比较小的一个进行适配fitRatio = realWidth / baseSize;fitRatioPx = physicalWidth / baseSize * 2; ///iphone6的dp和px转换需要乘以2///iphone6时实际值如下:// fitRatio = realWidth / 375;// fitRatioPx = physicalWidth / 750; ///iphone6的dp和px转换需要乘以2debugPrint('PWidth: $physicalWidth, PHeight: $physicalHeight, RWidth: $realWidth, RHeight: $realHeight dpr: $dpr, top: $statusBarHeight');}///以pt为单位时使用此方法static double setFitRatio(double value) {return value * fitRatio;}///以px为单位时使用此方法static double setFitRatioPx(double value) {return value * fitRatioPx;}
}///使用自己设计的屏幕适配类来适配屏幕
Container(color: Colors.orange,width: XScreenUtil.setFitRatio(200),height: XScreenUtil.setFitRatio(200),child: const  Icon(Icons.pages),
),

上面的示例代码单独封装了一个类,通过类的静态方法可以直接使用屏幕比率,也就是代码中的setFitRatio()方法,代码中使用了MediaQuery类的size属性获取到了屏幕的宽度和长度。这个值会随着屏幕的不同而不同。需要注意的是尺寸的单位不一样,使用的方法也不一样。此外,代码中把基准值当作了类构造函数中的可选参数,如果指定了基准值,那么就使用基准值,反之使用默认值750.

看官们,关于"如何实现屏幕适配"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

http://www.lryc.cn/news/120530.html

相关文章:

  • 免费实用的日记应用:Day One for Mac中文版
  • HCIP的BGP基础实验
  • centos7编译安装升级python3.11
  • win10安装mysql和c++读取调用举例
  • 计算机竞赛 opencv python 深度学习垃圾图像分类系统
  • 通讯协议037——全网独有的OPC HDA知识一之聚合(六)实际时间最小值
  • 【Freertos基础入门】freertos任务的优先级
  • 【报错】ModuleNotFoundError: No module named ‘websocket‘
  • [Leetcode] [Tutorial] 多维动态规划
  • C语言 二级指针和多级指针
  • 新机器到了要做的事情
  • 个人开发中常见单词拼错错误纠正
  • vb+sql汽车配件管理系统设计与实现
  • Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏)
  • winform 使用CommonOpenFileDialog选择文件夹或文件
  • EXPLAIN使用分析
  • 布局性能优化:安卓开发者不可错过的性能优化技巧
  • Python 中的机器学习简介:多项式回归
  • docker 容器中执行命令出现错误: 13: Permission denied
  • JavaWeb学习|JavaBean;MVC三层架构;Filter;Listener
  • arx 外部参照文件(XREF)的添加、删除、卸载和重载_objectarx
  • 【博客699】docker daemon预置iptables剖析
  • Golang 中的交叉编译详解
  • Python中的诡异事:不可见字符!
  • 【uniapp】uniapp使用微信开发者工具制作骨架屏:
  • 【UE4 RTS】06-Camera Edge Scroll
  • 无涯教程-Perl - length函数
  • 怎样在 CentOS 里下载 RPM 包及其所有依赖包
  • 在Ubuntu上使用NFS挂载
  • 复现海康威视综合安防管理平台artemis接口Spring boot heapdump内存泄露漏洞