【问题标题】:Sizing elements to percentage of screen width/height将元素调整为屏幕宽度/高度的百分比
【发布时间】:2017-08-24 15:06:24
【问题描述】:

是否有一种简单的(非 LayoutBuilder)方法可以根据屏幕尺寸(宽度/高度)调整元素的大小?例如:如何将 CardView 的宽度设置为屏幕宽度的 65%。

它不能在build 方法中完成(显然),所以它必须推迟到构建后。有没有首选的地方放这样的逻辑?

【问题讨论】:

  • 只是说,这通常不是 IMO 的好习惯,那是网页设计的东西。在应用程序中,您通常应该使用设备像素来定义尺寸,并使用填充来插入小部件,因为您的纵横比几乎总是相同的(平板电脑除外)。
  • 又过了 1.5 年,看来这毕竟不是一个坏主意。每个月都会有新手机推出,长宽比越来越奇怪。

标签: flutter dart flutter-layout screen-size


【解决方案1】:

您可以使用 Flexible 或 Expanded 子项构建一个列/行,这些子项的弹性值加起来等于您想要的百分比。

您可能还会发现AspectRatio 小部件很有用。

【讨论】:

    【解决方案2】:

    FractionallySizedBox 也可能有用。 您也可以直接从MediaQuery.of(context).size 中读取屏幕宽度,并根据它创建一个大小的框

    MediaQuery.of(context).size.width * 0.65
    

    如果您真的想将尺寸缩小为屏幕的一部分,而不管布局是什么。

    【讨论】:

      【解决方案3】:

      这可能更清楚一点:

      double width = MediaQuery.of(context).size.width;
      
      double yourWidth = width * 0.65;
      

      希望这能解决您的问题。

      【讨论】:

        【解决方案4】:

        如果您使用的是 GridView,则可以使用 Ian Hickson 的解决方案。

        crossAxisCount: MediaQuery.of(context).size.width <= 400.0 ? 3 : MediaQuery.of(context).size.width >= 1000.0 ? 5 : 4
        

        【讨论】:

          【解决方案5】:
          MediaQuery.of(context).size.width
          

          【讨论】:

            【解决方案6】:

            您可以将 MediaQuery 与小部件的当前上下文一起使用,并像这样获取宽度或高度 double width = MediaQuery.of(context).size.width double height = MediaQuery.of(context).size.height 之后,您可以将其乘以您想要的百分比

            【讨论】:

              【解决方案7】:

              这是一个补充答案,显示了所提到的几个解决方案的实现。

              FractionallySizedBox

              如果您有一个小部件,您可以使用FractionallySizedBox 小部件来指定要填充的可用空间的百分比。这里绿色的Container 设置为填充可用宽度的 70% 和可用高度的 30%。

              Widget myWidget() {
                return FractionallySizedBox(
                  widthFactor: 0.7,
                  heightFactor: 0.3,
                  child: Container(
                    color: Colors.green,
                  ),
                );
              }
              

              展开

              Expanded 小部件允许小部件填充可用空间,如果它在一行中,则水平填充,如果在列中,则垂直填充。您可以将flex 属性与多个小部件一起使用以赋予它们权重。这里绿色的Container 占宽度的 70%,黄色的Container 占宽度的 30%。

              如果你想垂直做,那么只需将Row替换为Column

              Widget myWidget() {
                return Row(
                  children: <Widget>[
                    Expanded(
                      flex: 7,
                      child: Container(
                        color: Colors.green,
                      ),
                    ),
                    Expanded(
                      flex: 3,
                      child: Container(
                        color: Colors.yellow,
                      ),
                    ),
                  ],
                );
              }
              

              补充代码

              这是main.dart 代码供您参考。

              import 'package:flutter/material.dart';
              
              void main() => runApp(MyApp());
              
              class MyApp extends StatelessWidget {
                @override
                Widget build(BuildContext context) {
                  return MaterialApp(
                    home: Scaffold(
                      appBar: AppBar(
                        title: Text("FractionallySizedBox"),
                      ),
                      body: myWidget(),
                    ),
                  );
                }
              }
              
              // replace with example code above
              Widget myWidget() {
                return ...
              }
              

              【讨论】:

              • 请注意,如果您正在远程构建类似于进度条的任何东西,您可能希望将FractionallySizedBox 构造函数alignment 参数设置为Alignment.centerLeft,默认为Alignment.center .
              【解决方案8】:

              首先获取屏幕的大小。

              Size size = MediaQuery.of(context).size;
              

              在此之后,您可以获得width 并将其与0.5 相乘以获得屏幕宽度的50%。

              double width50 = size.width * 0.5;
              

              但问题一般出现在height,默认情况下我们使用时

              double screenHeight = size.height;
              

              我们得到的高度是全局高度,包括StatusBar + notch + AppBar 高度。因此,为了得到设备的左侧高度,我们需要从总高度中减去padding 高度(StatusBar + notch)和AppBar 高度。这是我们如何做到的。

              double abovePadding = MediaQuery.of(context).padding.top;
              double appBarHeight = appBar.preferredSize.height;
              double leftHeight = screenHeight - abovePadding - appBarHeight;
              

              现在我们可以使用跟随来获得 50% 的屏幕高度。

              double height50 = leftHeight * 0.5
              

              【讨论】:

              • 这救了我的命。不过,我必须指出,上下文(由 abovePadding 使用)必须是来自 appBar 的上下文。
              【解决方案9】:

              有很多方法可以做到这一点。

              1.使用 MediaQuery : 它返回您设备的全屏,包括应用栏、工具栏

               Container(
                      width: MediaQuery.of(context).size.width * 0.50,
                      height: MediaQuery.of(context).size.height*0.50, 
                      color: Colors.blueAccent[400],
               )
              




              2。使用 Expanded :您可以按比例设置宽度/高度

               Container(
                      height: MediaQuery.of(context).size.height * 0.50,
                      child: Row(
                        children: <Widget>[
                          Expanded(
                            flex: 70,
                            child: Container(
                              color: Colors.lightBlue[400],
                            ),
                          ),
                          Expanded(
                            flex: 30,
                            child: Container(
                              color: Colors.deepPurple[800],
                            ),
                          )
                        ],
                      ),
                  )
              



              3. 其他喜欢FlexibleAspectRatioFractionallySizedBox

              【讨论】:

                【解决方案10】:

                使用 LayoutBuilder Widget,它会为您提供约束,您可以使用这些约束来获取不包括 AppBar 和 padding 的高度。然后使用 SizedBox 并使用 LayoutBuilder 中的约束提供宽度和高度

                return LayoutBuilder(builder: (context2, constraints) {
                  return Column(
                    children: <Widget>[
                      SizedBox(
                        width: constraints.maxWidth,
                        height: constraints.maxHeight,
                        ...
                

                【讨论】:

                  【解决方案11】:

                  代码:

                  MediaQuery.of(context).size.width //to get the width of screen
                  MediaQuery.of(context).size.height //to get height of screen
                  

                  【讨论】:

                    【解决方案12】:

                    有几种可能:

                    1-第一个是MediaQuery的使用:

                    代码:

                    MediaQuery.of(context).size.width //to get the width of screen
                    MediaQuery.of(context).size.height //to get height of screen
                    

                    使用示例:

                    Container(
                            color: Colors.yellow,
                            height: MediaQuery.of(context).size.height * 0.65,
                            width: MediaQuery.of(context).size.width,
                          )
                    

                    输出:

                    2-FractionallySizedBox的使用

                    创建一个小部件,将其子部件的大小调整为总可用空间的一小部分。

                    示例:

                    FractionallySizedBox(
                               widthFactor: 0.65, // between 0 and 1 
                               heightFactor: 1.0,
                               child:Container(color: Colors.red
                               ,),
                             )
                    

                    输出:

                    3- 其他小部件的使用,例如ExpandedFlexibleAspectRatio 等等。

                    【讨论】:

                      【解决方案13】:

                      您可以使用 Align 小部件。 heightFactorwidthFactor 参数乘以子小部件的大小。这是一个示例,它将制作具有固定高度百分比的小部件

                               Align(
                                  alignment: Alignment.topCenter,
                                  heightFactor: 0.63,
                                  widthFactor: ,
                                  child: Container(
                                    width: double.infinity,
                                  ),
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-11-17
                        • 1970-01-01
                        • 2013-11-01
                        • 2013-03-28
                        • 2013-03-13
                        • 2014-06-07
                        • 1970-01-01
                        • 2013-09-03
                        相关资源
                        最近更新 更多