flutter系列之:flutter中的变形金刚Transform

简介: 虽然我们在开发APP的过程中是以功能为主,但是有时候为了美观或者其他的特殊的需求,需要对组件进行一些变换。在Flutter中这种变换就叫做Transform。flutter的强大之处在于,可以对所有的widget进行Transform,因此可以做出非常酷炫的效果。

简介

虽然我们在开发APP的过程中是以功能为主,但是有时候为了美观或者其他的特殊的需求,需要对组件进行一些变换。在Flutter中这种变换就叫做Transform。

flutter的强大之处在于,可以对所有的widget进行Transform,因此可以做出非常酷炫的效果。

Transform简介

在Flutter中,Transform本身也是一个Widget,它主要是把变换作用在它的子widget上。我们先来看下Transform的定义和构造函数:

class Transform extends SingleChildRenderObjectWidget
  const Transform({
    Key? key,
    required this.transform,
    this.origin,
    this.alignment,
    this.transformHitTests = true,
    this.filterQuality,
    Widget? child,
  }) : assert(transform != null),
       super(key: key, child: child);

可以看到Transform需要transform,origin,alignment,transformHitTests和filterQuality这几个属性。

其中transform是一个Matrix4对象,它是一个4维的矩阵,用来描述child应该怎么被transform。

origin是一个Offset对象,表示的是原始坐标系的值,默认是左上角。origin和transform是有关联关系的,我们可以通过修改origin来达到不同的transform的效果。

alignment是origin的对其方式,是一个AlignmentGeometry对象。

filterQuality是在进行图像变换的过程中,图像的取样质量。

除了上面这个默认的构造函数之外,为了简单起见Transform还提供了几个有特殊作用的构造函数:

Transform.rotate({
    Key? key,
    required double angle,
    this.origin,
    this.alignment = Alignment.center,
    this.transformHitTests = true,
    this.filterQuality,
    Widget? child,
  }) : transform = Matrix4.rotationZ(angle),
       super(key: key, child: child);

Transform.rotate就是对子child进行旋转变换。

通过传入angle属性,实现子child沿Z轴旋转。

Transform.translate({
    Key? key,
    required Offset offset,
    this.transformHitTests = true,
    this.filterQuality,
    Widget? child,
  }) : transform = Matrix4.translationValues(offset.dx, offset.dy, 0.0),
       origin = null,
       alignment = null,
       super(key: key, child: child);

Transform.translate是通过改变offset的值来修改原始坐标系的位置。

Transform.scale({
    Key? key,
    required double scale,
    this.origin,
    this.alignment = Alignment.center,
    this.transformHitTests = true,
    this.filterQuality,
    Widget? child,
  }) : transform = Matrix4.diagonal3Values(scale, scale, 1.0),
       super(key: key, child: child);

Transform.scale通过传入scale,来对子child进行放大缩小。

从上面的不同构造函数可以看出来,实际上最终都将传入的参数转换成为Matrix4的transform对象。

如果你对Matrix4熟悉的话,那么可以用最直接的构造函数,直接传入Matrix4。

Transform的使用

上面我们介绍了Transform.rotate,Transform.translate和Transform.scale这几个构造函数,接下来我们将会使用具体的例子来进行详细的讲解。

首先是Transform.rotate,用来对子组件进行旋转,下面是一个使用的例子:

Widget build(BuildContext context) {
    return Center(
      child: Transform.rotate(
        angle: pi/4,
        child: const Icon(
            Icons.airplanemode_active,
            size: 200,
          color: Colors.blue,
        ),
      ));
  }

上面的例子将一个飞机的Icon旋转pi/4,也就是45度,最后生成的界面如下:

接下来是Transform.translate,这个方法主要是对子组件进行坐标轴变换,需要传入一个offset选项,如下所示:

return Transform.translate(
          offset:const Offset(50.0, 100.0),
          child: const Icon(
            Icons.airplanemode_active,
            size: 200,
            color: Colors.blue,
          ),
        );

上面我们还是使用了飞机的图标,不过对他进行了坐标轴变换,最后得出的界面如下:

最后我们要展示的是Transform.scale,用来对子组件进行缩放。

上面我们的图标size是200,我们可以将其缩放为50%,如下所示:

return Transform.scale(
      scale: 0.5,
      child: const Icon(
        Icons.airplanemode_active,
        size: 200,
        color: Colors.blue,
      ),
    );

运行我们可以得到下面的界面:

是不是变小了很多?

总结

Transform是一个功能强大的widget,通过Transform我们可以做出很多非常有趣的效果。

本文的例子:https://github.com/ddean2009/learn-flutter.git

相关文章
Flutter 45: 图解矩阵变换 Transform 类 (二)
0 基础学习 Flutter,第四十五步:Matrix4 四阶矩阵学习一下!
3120 0
|
Dart 前端开发
【绘制 widget】Flutter Transform
【绘制 widget】Flutter Transform
184 0
【绘制 widget】Flutter Transform
Flutter基础widgets教程-Transform篇
Flutter基础widgets教程-Transform篇
262 0
Flutter基础widgets教程-Transform篇
|
容器 前端开发
Flutter 44: 图解矩阵变换 Transform 类 (一)
0 基础学习 Flutter,第四十四步:初识 Transform!
2802 0
|
1月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
1月前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
74 3
|
17天前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
130 0
|
19天前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
60 0
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
77 7
|
1月前
|
编解码 Dart API
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
本文介绍了如何开发一个 Flutter 鸿蒙插件,实现 Flutter 与鸿蒙的混合开发及双端消息通信。通过定义 `MethodChannel` 实现 Flutter 侧的 token 存取方法,并在鸿蒙侧编写 `EntryAbility` 和 `ForestPlugin`,使用鸿蒙的首选项 API 完成数据的读写操作。文章还提供了注意事项和参考资料,帮助开发者更好地理解和实现这一过程。
57 0