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

news2024/10/5 23:30:15

文章目录

  • 简介
  • Transform简介
  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IBM MQ 通道

一,定义 通道是分布式队列管理器在IBM MQ MQI 客户端和IBM MQ服务器之间或两个IBM MQ服务器之间使用的逻辑通信链接。 通道是提供从一个队列管理器到另一个队列管理器的通信路径的对象。通道在分布式队列中用于将消息从一个队列管理器移动到另一个队列管理器&#x…

计算机网络-应用层详解(持续更新中)

应用层概述 应用层是解决通过应用进程的交互来实现特定网络应用的问题。 应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件、远程登录、文件传输、新…

百度联合行业头部企业新发5个行业大模型,大模型产业落地路径愈发清晰

本文已在【飞桨PaddlePaddle】公众号平台发布,详情请戳链接:百度联合行业头部企业新发5个行业大模型,大模型产业落地路径愈发清晰 11月30日,由深度学习技术与应用国家工程研究中心主办、飞桨承办的WAVE SUMMIT2022深度学习开发者…

WLAN AP安全策略中WPA认证与WPA2认证的差异

一、安全策略WPA认证(PSK认证TKIP加密)的案例 组网需求: 设备作为FAT AP,为用户提供WLAN服务,用户可以搜索到名为huawei的无线网络,采用的安全策略为WPA-PSK认证TKIP加密的方式。 组网图如下:…

3 内存访问

内存访问 1 字的存储 寄存器中:16位寄存器存一个字。高8位放高位字节,低8位当低位字节。 内存中:内存单元是字节单元,一个字要用2个连续的内存单元保存。低位字节保存在低地址内存单元,高位字节保存在高地址内存单元…

vmware上的centos8没有网络

目录一、先了解虚拟机的三种网络模式二、目前的网络模式和网络状况三、 解决网络不可用问题一、先了解虚拟机的三种网络模式 虚拟机的三种网络模式 二、目前的网络模式和网络状况 我的虚拟机网络配置 我们要将虚拟机和本机在同一个局域网络里才能入网 进入cmd输入ipconfig…

Java多线程之常用的相关方法总结(线程停止、线程休眠、线程礼让、线程优先级、守护线程等等)

Java多线程之相关常用方法一、线程方法二、线程停止1、思路2、样例三、线程休眠(sleep)1、思路2、样例四、线程礼让(yield)1、思路2、样例五、线程强制执行(join)1、思路2、样例六、观测线程状态1、相关概念…

Mac配置python wind量化接口

首先Mac与Windows的wind配置完全不同: Windows:wind相对容易配置,直接用软件就可以点击并添加配置环境即可Mac配置如下 文章目录Mac上Wind的基本情况Mac配置python Wind量化接口1. 在App Store中下载并打开 “Wind App” 这个应用2. 配置pyt…

带有SPI接口的独立CAN控制器DP2515

DP2515是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 DP2515自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要…

MySql使用MyCat分库分表(五)MyCat 管理及监控

视频学习地址:17-尚硅谷-垂直分库_哔哩哔哩_bilibili 笔记参考地址:MySQL 分库分表 | xustudyxus Blog (frxcat.fun) MyCat 管理 Mycat默认开通2个端口,可以在server.xml中进行修改。 8066 数据访问端口,即进行 DML 和 DDL 操…

Java搭建宝塔部署实战毕设项目SSM学生学籍管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕设项目SSM学生学籍管理系统的源码,适合拿来做毕业设计的同学。可以下载来学习一下,本期把这套系统分享给大家。 技术架构 技术框架:ssm layui…

Kafka 数据重复怎么办?(案例)

一、前言 数据重复这个问题其实也是挺正常,全链路都有可能会导致数据重复。 通常,消息消费时候都会设置一定重试次数来避免网络波动造成的影响,同时带来副作用是可能出现消息重复。 整理下消息重复的几个场景: 生产端&#xff1…

Scanner、Random、stirng

API的使用 API : Application Programming Interface [应用程序编程接口] -> 帮助文档,词典 [对JDK的翻译文档][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aWo9KVNQ-1670235353300)(https://cdn.staticaly.com/gh/quinhua/picsmain/markdown/…

RabbitMQ发布确认高级

在生产环境中由于一些不明原因,导致 RabbitMQ 重启,在 RabbitMQ 重启期间生产者消息投递失败,导致消息丢失,需要手动处理和恢复。 在这样比较极端的情况,RabbitMQ 集群不可用的时候,无法投递的消息该如何处…

Chrome安装油猴插件详细教程

Chrome安装油猴插件详细教程 一、油猴安装方法 方法一:Google官方商店安装(推荐,需要科学上网) 方法二:本地安装(无需科学上网,不会科学上网的适用) 二、安装油猴插件 方法一&am…

FineReport数据图表制作-标签控件

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 应用场景 「标签控件」不支持填报应用,只能在参数页面下使用。如下图所示: 注:移动端不识别「标签控件」,识别的是普通控件的「标签名称」属性,所以移动端…

我不说你知道 DotImage SDK之DotViewer 在线文档查看编辑?

关注我 日日新,关注我 一手料,关注我 懂国外,关注我 更新快,关注我 不玩假!!!! 开发团队被请求淹没,并被迫用更少的资源做更多的事情。DotViewer 旨在帮助解决这一挑战&…

sequencer和sequence

●了解了sequencer与driver之间传递sequence item的握手过程,同时也掌握了sequence与item之间的关系。 ●接下来需要就sequence挂载到sequencer的常用方法做出总结,大家可以通过对这些常用方法和宏的介绍,了解到它们不同的使用场景。 ●面对多个sequence如果需要同时…

Python学习----静态web服务器

开发静态web服务器 开发步骤: 1、编写一个TCP服务端程序 2、获取浏览器发送的HTTP请求报文数据 3、读取固定页面数据,把页面数据组装HTTP响应报文数据发送给浏览器 4、HTTP响应报文数据发送完成之后,关闭服务于客户端的套接字 import socke…

(Java)Mybatis学习笔记(四)

前言 继续学习自定义映射,今天便是mybatis初步学完的最后一天了,加油,奥里给~ 搭建MyBatis框架 步骤说明 创建表时把email打成了eamil,导致报了下错 1️⃣在mybatis下创建一个module 2️⃣配置pom.xml文件,导入相…