美文网首页
Flutter 屏幕适配 -- 百分比

Flutter 屏幕适配 -- 百分比

作者: Android_开发工程师 | 来源:发表于2020-03-22 10:41 被阅读0次

    本文是根据 Daniele Cambi 的文章 Flutter — Effectively scale UI according to different screen sizes 总结而来 :

    文章地址 :https://medium.com/flutter-community/flutter-effectively-scale-ui-according-to-different-screen-sizes-2cb7c115ea0a(自备扶梯)

    本文核心思想 :

    作者创建一个矩形 :

    Container(
    
        height: 40,
    
        width: 60,
    
    )
    

    在iPhone 5s (4" Display) and on an iPhone XS Max (6,46" Display),

    显示效果的差异 !!! 如何解决这个问题呢 ?

    注: Flutter 使用的 逻辑像素 logical pixels 为单位 ,和 Android的 dp还是不一样

    具体 lp 有什么效果,网上也没查到具体资料😢

    F351C2BC-3FCC-4159-AB4C-59374D000780.png

    如何解决这个问题呢 ?

    作者认为可以把屏幕认为是一个 , 100 * 100 的格子(或者认为水平方向和竖直方向,平均分成100个单位 ,恩 ,是不是就是Android中的百分比布局了)

    9826144B-C0BB-4228-BFE4-35E98BCD7D4F.png

    作者新建一个帮助类 :

    import ‘package:flutter/widgets.dart’;
    
    class SizeConfig {
    
    static MediaQueryData _mediaQueryData;
    
    static double screenWidth;
    
    static double screenHeight;
    
    static double blockSizeHorizontal;
    
    static double blockSizeVertical;
    
    // 初始化方法
    
    void init(BuildContext context) {
    
    _mediaQueryData = MediaQuery.of(context);
    
    // flutter系统提供的类,可以查询屏幕方向,屏幕宽、高
    
    // 返回的宽、高,单位: dp, 宽高返回的单位是 dp 哦!!!
    
    // 返回屏幕宽高,是随着屏幕旋转,返回值是不一样的 !!!
    
    screenWidth = _mediaQueryData.size.width;
    
    screenHeight = _mediaQueryData.size.height;
    
    // 屏幕宽高 ,均分 100 份
    
    blockSizeHorizontal = screenWidth / 100;
    
    blockSizeVertical = screenHeight / 100;
    
        }
    
    }
    

    初始化方法 :

    class HomeScreen extends StatelessWidget {
    
    @override
    
    Widget build(BuildContext context) {
    
        SizeConfig().init(context);
    
        }
    }
    

    使用帮助类来设置widget大小 :

    @override
    
    Widget build(BuildContext context) {
    
    return Center(
    
    child: Container(
    
         height: SizeConfig.blockSizeVertical * 20,
    
         width: SizeConfig.blockSizeHorizontal * 50,
    
         color: Colors.orange,
           ),
       );
    }
    

    效果图 :

    6604598D-0E2D-4EA1-868B-56BE6A5F6400.png

    对异形屏 ,刘海屏,水滴屏等异形屏幕(notches)和状态栏(status bars)、导航栏(navigation bars)的处理


    在Flutter中有一个非常方便的小部件,可以有效地处理这些问题,它被称为“安全区域”( SafeArea)。

    个人理解,flutter , 把 异形屏 ,导航栏相关区域称为 安全区域 。

    作者的思想 :屏幕的长宽去掉安全区域的大小,然后分成 100份 ,算出每一块的单位长度 。

    class SizeConfig {
    
    static MediaQueryData _mediaQueryData;
    
    static double screenWidth;
    
    static double screenHeight;
    
    static double blockSizeHorizontal;
    
    static double blockSizeVertical;
    
    static double _safeAreaHorizontal;
    
    static double _safeAreaVertical;
    
    static double safeBlockHorizontal;
    
    static double safeBlockVertical;
    
    void init(BuildContext context) {
    
    _mediaQueryData = MediaQuery.of(context);
    
    screenWidth = _mediaQueryData.size.width;
    
    screenHeight = _mediaQueryData.size.height;
    
    blockSizeHorizontal = screenWidth / 100;
    
    blockSizeVertical = screenHeight / 100;
    
    _safeAreaHorizontal = _mediaQueryData.padding.left +
    
    _mediaQueryData.padding.right;
    
    _safeAreaVertical = _mediaQueryData.padding.top +
    
    _mediaQueryData.padding.bottom;
    
    safeBlockHorizontal = (screenWidth -
    
    _safeAreaHorizontal) / 100;
    
    safeBlockVertical = (screenHeight -
    
    _safeAreaVertical) / 100;
    
        }
    
    }
    

    文字的缩放

    我们可以使用 SizeConfig.safeBlockHorizontal or SizeConfig.safeBlockVertical为单位 ,对文字进行缩放 。

    image.png

    如果您已经看到这里,不妨我们深度思考一下


    真实的软件开发过程,一般是设计人员先设计好设计图 or 设计稿(一般是1080px * 1920px为基准),然后研发人员进行开发

    那我们就把屏幕宽和长 ,分成 1080 和 1920 个单位 ,然后按设计图上的标注去填写相应widgets的大小

    所以我认为 flutter 非常适合百分比布局(天生适合按比例布局)

    而Android 百分比布局,适配工作量非常大,兼容性差

    在网上发现了一个开源库 ,原理我觉得差不多,大家可以学习一下

    flutter_screenutil

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


    如果觉得文章有用,帮忙点个喜欢❤️ ,😘😘😘


    相关文章

      网友评论

          本文标题:Flutter 屏幕适配 -- 百分比

          本文链接:https://www.haomeiwen.com/subject/dqemyhtx.html