Flutter界面缩放设计插件scale_design的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter界面缩放设计插件scale_design的使用

1. 安装

要使用此插件,可以在项目中运行以下命令:

flutter pub add scale_design

这将会自动安装最新版本到您的项目中。

2. 使用

1. 尺寸工具集的使用

初始化Scale

在使用缩放功能之前,需要使用所需的屏幕宽度和高度值初始化Scale类。通常情况下,应该在应用的主文件或应用早期部分进行初始化。

import 'package:flutter/material.dart';
import 'package:scale_design/scale_design.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    // 初始化Scale类并设置标准屏幕尺寸
    Scale().init(context, 375.0, 812.0);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('缩放设计示例'),
        ),
        body: Center(
          child: Container(
            width: scaleWidth(200), // 缩放后的宽度
            height: scaleHeight(100), // 缩放后的高度
            color: Colors.blue,
            child: Center(
              child: Text(
                '响应式文本',
                style: TextStyle(
                  fontSize: scaleWidth(16), // 缩放后的字体大小
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中,布局尺寸和字体大小根据当前屏幕尺寸按比例缩放,从而创建了一个响应式的设计。

缩放函数

一旦Scale类被初始化,您可以使用提供的缩放函数来根据屏幕大小调整布局。例如,要缩放一个高度值:

double scaledHeight = scaleHeight(50); // 根据屏幕大小缩放高度

同样地,您可以缩放宽度、获取屏幕宽度或高度的比例,并根据不同的设备自定义布局。

double scaledWidth = scaleWidth(100); // 根据屏幕大小缩放宽度
double oneThirdScreenWidth = perWidth(3); // 获取屏幕宽度的三分之一
double oneFifthScreenHeight = perHeight(5); // 获取屏幕高度的五分之一

2. 响应式工具集的使用

响应式组件

响应式组件是一种用于在Flutter应用程序中实现响应式布局的工具。它允许开发者根据用户设备的屏幕宽度显示不同的布局,支持移动设备、平板电脑和桌面。通过为移动设备、平板电脑和桌面提供不同的部件,可以为不同的屏幕尺寸定制布局。

使用方法
  1. 定义布局:首先,为不同类型的设备定义布局。这意味着您需要准备三个部件,每个部件对应移动设备、平板电脑和桌面。
  2. 使用响应式组件:在界面上使用响应式组件,并传递之前定义的布局部件。
示例

假设您有三个布局部件:MobileLayoutTabletLayoutDesktopLayout。您可以这样使用响应式组件:

import 'package:flutter/material.dart';
import 'package:scale_design/scale_design.dart';

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Responsive(
        mobile: MobileLayout(), // 移动设备布局
        tablet: TabletLayout(), // 平板设备布局
        desktop: DesktopLayout(), // 桌面设备布局
      ),
    );
  }
}

在大多数情况下,我们有移动设备和桌面设备的布局。平板设备的布局通常介于两者之间,可以替换其中任何一个,所以您不一定需要显式指定 <code>tablet</code> 选项;它会自动使用 <code>desktop</code> 选项的值。

响应式Scaffold组件

ResponsiveScaffold 组件是一个基于双重导航栏的快速构建响应式应用的框架。

import 'package:flutter/material.dart';
import 'package:app_service/app_service.dart';
import 'package:scale_design/scale_design.dart';
import '../../widgets/hr_v.dart';

class IndexView extends StatelessWidget {
  static const String url = '/index';
  // 定义底部导航项
  final List&lt;BottomNavigationBarItem&gt; _navBarItems = const [
    BottomNavigationBarItem(
      icon: Icon(Icons.home_outlined),
      label: 'Home',
    ),
    BottomNavigationBarItem(
      icon: Icon(Icons.library_music_outlined),
      label: 'Business',
    ),
    BottomNavigationBarItem(
      icon: Icon(Icons.account_circle_outlined),
      label: 'School',
    ),
  ];

  // 定义对应的页面
  final List&lt;Widget&gt; _pages = const [
    Page1(),
    Page2(),
    Page3(),
  ];

  const IndexView({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ResposiveScaffold(
      pages: _pages,
      items: _navBarItems,
      appBar: AppBar(
        title: const Text('缩放设计响应式Scaffold示例'),
        actions: const [
          Wen(),
          HrV(),
          DarkModeSwitch(),
          HrV(),
          ThemeModal(),
        ],
      ),
    );
  }
}

class Page1 extends StatelessWidget {
  const Page1({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Center(
      child: Text(
        'Page1',
        style: TextStyle(fontSize: 60),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  const Page2({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Center(
      child: Text(
        'Page2',
        style: TextStyle(fontSize: 60),
      ),
    );
  }
}

class Page3 extends StatelessWidget {
  const Page3({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const Center(
      child: Text(
        'Page3',
        style: TextStyle(fontSize: 60),
      ),
    );
  }
}

响应式Scaffold示例

3. 其他组件

SlideText组件

SlideText 是一个垂直滚动的文本部件。

例如:

SlideText(
  [
    '你有未读消息,请尽快处理1',
    '你有未读消息,请尽快处理2',
    '你有未读消息,请尽快处理3',
    '你有未读消息,请尽快处理4',
  ],
  // 默认向上滚动
  isScrollUp: true, 
)

效果如下:

滑动文本效果

您可以通过 fontSize 参数设置文本大小。这个大小已经基于 scaleFont 大小,因此不需要手动调用 fontSize。如果需要控制高度,可以指定 height 参数,也不需要手动调用 scaleHeight 参数。

ScrollableIconsCard组件

ScrollableIconsCard 是一个用于显示一组可水平滚动的图标卡片的组件。

例如:

// 定义一组图标及其点击回调
List&lt;Map&lt;String, Object&gt;&gt; datas = [
  {'img': 'assets/svgs/捡漏.svg', 'title': '捡漏', 'onTap': () =&gt; print('捡漏')},
  {'img': 'assets/svgs/摇现金.svg', 'title': '摇现金', 'onTap': () =&gt; print('捡漏')},
  {'img': 'assets/svgs/聚补贴.svg', 'title': '聚补贴', 'onTap': () =&gt; print('捡漏')},
  {'img': 'assets/svgs/领券中心.svg', 'title': '领券中心', 'onTap': () =&gt; print('捡漏')},
];

ScrollableIconsCard(
  datas: datas,
),

效果如下:

滚动图标卡片效果

ScrollableIconsCard 组件的各种参数默认值如下:

参数名 类型 默认值 描述
amount int 3 每列的数量
spoutWidth double 80 导轨宽度
sliderWidth double 40 滑块宽度
sliderHeight double 7 导轨和滑块的高度
spoutColor Color Color.fromARGB(255, 183, 183, 183) 导轨颜色
sliderColor Color Color.fromARGB(255, 255, 134, 13) 滑块颜色

其中宽度基于 scaleWidth,高度基于 scaleHeight

提示

您可以在 scale design 示例 中找到更多示例,例如:

图片 动图
示例图片 示例动图
ShinyButton组件

具有光影效果的按钮可以通过指定一组颜色值来实现光和阴影动画,例如:

class ShinyButtonExample extends StatelessWidget {
  const ShinyButtonExample({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: T(
          '光影按钮',
          fontSize: 18,
        ),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            // 当仅传递 onPressed 的时候
            ShinyButton(onPressed: () {}),

            const SizedBox(height: 30),

            // 如果没有任何参数则成为禁用状态
            ShinyButton(),

            const SizedBox(height: 30),

            // 你可以自定义圆角、颜色、子元素等参数
            ShinyButton(
              borderRadius: 20,
              colors: const [
                Color.fromARGB(255, 112, 255, 117),
                Color.fromARGB(255, 0, 81, 3),
                Color.fromARGB(255, 112, 255, 117),
              ],
              child: T(
                '自定义一些属性',
                color: Colors.amber,
                fontSize: 20,
                fontWeight: FontWeight.bold,
              ),
              onPressed: () {
                print('Button Pressed');
              },
            ),

            const SizedBox(height: 30),

            // 使用 disabled 属性禁用按钮
            ShinyButton(
              borderRadius: 20,
              width: 300,
              colors: const [
                Color.fromARGB(255, 112, 255, 117),
                Color.fromARGB(255, 0, 81, 3),
                Color.fromARGB(255, 112, 255, 117),
              ],
              disabled: true,
              onPressed: () {},
              child: T(
                '使用 disabled 属性禁用按钮',
                color: Colors.white,
                fontSize: 20,
                fontWeight: FontWeight.bold,
              ),
            ),

            const SizedBox(height: 30),

            // 一个登陆按钮的示例
            ShinyButton(
              borderRadius: 60,
              width: 310,
              colors: const [
                Color.fromARGB(255, 255, 224, 112),
                Color.fromARGB(255, 220, 77, 0),
                Color.fromARGB(255, 255, 224, 112),
              ],
              onPressed: () {},
              child: T(
                '登 陆',
                color: Colors.white,
                fontSize: 23,
                fontWeight: FontWeight.bold,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter界面缩放设计插件scale_design的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter界面缩放设计插件scale_design的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用scale_design插件来实现界面缩放的代码案例。scale_design插件可以帮助你根据设备的屏幕尺寸和分辨率动态调整UI元素的尺寸,从而提供更好的用户体验。

首先,确保你的Flutter项目中已经添加了scale_design依赖。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  scale_design: ^最新版本号  # 请替换为实际最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在代码中使用scale_design插件。下面是一个简单的示例,展示了如何使用ScaleDesign来缩放UI元素:

import 'package:flutter/material.dart';
import 'package:scale_design/scale_design.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    // 初始化ScaleDesign
    final scaleDesign = ScaleDesign(
      designWidth: 375, // 设计稿宽度
      designHeight: 667, // 设计稿高度
    );

    // 获取缩放后的尺寸
    double scaledWidth(double width) => scaleDesign.width(width);
    double scaledHeight(double height) => scaleDesign.height(height);
    double scaledFontSize(double fontSize) => scaleDesign.fontSize(fontSize);

    return Scaffold(
      appBar: AppBar(
        title: Text('Scale Design Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hello, Flutter!',
              style: TextStyle(fontSize: scaledFontSize(24)), // 缩放字体大小
            ),
            SizedBox(height: scaledHeight(20)), // 缩放间距
            Container(
              width: scaledWidth(100),
              height: scaledHeight(50),
              color: Colors.blue,
              child: Center(
                child: Text(
                  'Button',
                  style: TextStyle(color: Colors.white, fontSize: scaledFontSize(16)),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化ScaleDesign:在_MyHomePageStatebuild方法中,我们创建了一个ScaleDesign实例,并指定了设计稿的宽度和高度。

  2. 定义缩放函数:我们定义了三个函数scaledWidthscaledHeightscaledFontSize,用于根据设计稿尺寸缩放UI元素的宽度、高度和字体大小。

  3. 应用缩放:在UI布局中,我们使用这些缩放函数来调整Text和Container的尺寸和字体大小。

这样,当应用在不同的屏幕尺寸和分辨率上运行时,UI元素会根据ScaleDesign插件的计算结果自动缩放,从而提供更好的适配效果。

请注意,这只是一个简单的示例。在实际项目中,你可能需要根据具体需求对缩放逻辑进行更细致的控制和调整。

回到顶部