Flutter笔记 - 用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类

news2024/11/30 0:52:52
Flutter笔记
用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类

作者李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/133418003



1. 概述

类名描述
AlignmentAlignment 类表示在矩形中的对齐位置,使用 Alignment 构造函数来创建。它以矩形的中心点为原点,水平方向为-1到1,垂直方向为-1到1的坐标系。例如,Alignment(-1.0, -1.0) 表示矩形的左上角。
AlignmentDirectionalAlignmentDirectional 类类似于 Alignment,但它使用 Start 和 End 而不是 Left 和 Right,适用于从左到右和从右到左的布局。例如,AlignmentDirectional(-1.0, -1.0) 表示矩形的起始位置的左上角。
AlignmentGeometryAlignmentGeometry 类是 AlignmentAlignmentDirectional 的抽象基类,用于支持不同的对齐方式。它允许根据布局方向(LTR或RTL)动态地选择 AlignmentAlignmentDirectional
AlignmentGeometryTweenAlignmentGeometryTween 类用于创建在两个 AlignmentGeometry 之间进行插值的动画。它通常用于动画对齐位置的平滑过渡。
AlignmentTweenAlignmentTween 类是 Alignment 的 Tween,用于创建在两个 Alignment 之间进行插值的动画。它通常用于动画普通的对齐位置的平滑过渡。

2. AlignmentGeometry抽象类

AlignmentGeometry 是一个用于表示偏移位置的抽象类,它的具体实现类 AlignmentAlignmentDirectional 分别用于不同的场景。通过使用这些类,可以轻松地定位和对齐小部件,而无需过多考虑文本方向和坐标系的差异。
AlignmentGeometry代表了可以用于定位和对齐小部件的不同位置或偏移方式。这个抽象类有两个主要的具体实现类:AlignmentAlignmentDirectional,它们分别用于不同的场景,具有不同的坐标系和方向。

  • 由于AlignmentGeometry 是一个抽象基类,不能直接实例化。需要使用具体的子类,如 AlignmentAlignmentDirectional
  • AlignmentGeometry 提供了一个抽象的坐标系统,可以用来表示不同位置或偏移。这个坐标系统以矩形的中心为原点,水平和垂直方向的范围从-1.0到+1.0。
  • Alignment 类用于表示与文本方向无关的偏移位置,而 AlignmentDirectional 用于表示依赖于文本方向的偏移位置。这使得小部件可以根据不同的文本方向正确地对齐和定位。
  • AlignmentGeometry 的具体实现类通常提供了一些常量,表示常见的偏移位置,例如 Alignment.topLeftAlignmentDirectional.bottomEnd
  • 支持动画和过渡AlignmentGeometry 可以用于创建动画或过渡,从一个位置平滑地过渡到另一个位置。

3. Alignment 组件

3.1 原理解析

Alignment 类表示矩形内的一个点,以矩形的中心为原点。它定义了一个坐标系,其中水平方向的范围是从 -1.0 到 1.0,垂直方向的范围也是从 -1.0 到 1.0。这个坐标系的中心点是 Alignment(0.0, 0.0),表示矩形的中心。具体的解释如下:

  • Alignment(0.0, 0.0) 表示矩形的中心。
  • 水平方向从 -1.0 移动到 +1.0 相当于从矩形的一边移动到另一边。因此,水平方向上的距离是矩形宽度的两倍。
  • Alignment(-1.0, -1.0) 表示矩形的左上角。
  • Alignment(1.0, 1.0) 表示矩形的右下角。
  • Alignment(0.0, 3.0) 表示一个点,水平方向居中于矩形,垂直方向下移了矩形高度的距离。
  • Alignment(0.0, -0.5) 表示一个点,水平方向居中于矩形,垂直方向在矩形的顶部边缘和中心之间的中点。

Alignment 通过 xy 两个参数来表示对齐位置,其中 x 控制水平位置,y 控制垂直位置。在给定矩形的情况下,可以通过以下公式将 Alignment 转换为坐标系中的点坐标:

点坐标 = (x * 矩形宽度 / 2 + 矩形宽度 / 2, y * 矩形高度 / 2 + 矩形高度 / 2)

这个坐标系使用视觉坐标,意味着增加 x 会从左向右移动点。为了支持从右到左的布局,可以考虑使用 AlignmentDirectional,它的水平方向取决于文本方向。

3.2 用法解析

Alignment 主要用于在矩形内部的定位,通常与一些组件一起使用,比如 Align。如:

Align(
  alignment: Alignment.center,
  child: Text('Centered Text'),
)

再如:

Container(
  width: 200.0,
  height: 200.0,
  child: Align(
    alignment: Alignment(-0.5, 0.5), // 自定义对齐位置
    child: Text('Custom Alignment'),
  ),
)

又如创建动画效果:

// 创建一个 AnimationController,用于控制动画。
AnimationController controller;

// 创建一个 AlignmentTween,定义动画的起始和结束位置。
// 在此示例中,动画从左上角(Alignment.topLeft)到右下角(Alignment.bottomRight)。
Animation<Alignment> animation = AlignmentTween(
  begin: Alignment.topLeft,     // 动画的起始位置
  end: Alignment.bottomRight,   // 动画的结束位置
).animate(controller);          // 使用 AnimationController 创建动画对象

// 在动画过程中更新组件位置的组件构建器。
AnimatedBuilder(
  animation: animation,         // 指定要监听的动画
  builder: (context, child) {
    // 使用 Align 组件将组件相对于动画值的位置进行对齐。
    return Align(
      alignment: animation.value,  // 使用动画值来控制对齐位置
      child: YourWidget(),        // 替换 YourWidget() 为你的组件
    );
  },
)

4. AlignmentDirectional组件

AlignmentDirectional 是一个用于定位组件相对于矩形的偏移的类,但它的水平位置依赖于文本方向。

4.1 原理解析

AlignmentDirectional 的工作原理与 Alignment 类似,但是它考虑了文本方向。可以在 TextDirection.ltr(从左到右的文本方向)和 TextDirection.rtl(从右到左的文本方向)之间切换,而不需要明确了解当前文本方向。它通过以下两个属性来定义偏移:

  • start:水平方向上的偏移,取值范围从 -1.0(表示左侧或"start"边缘)到 1.0(表示右侧或"end"边缘)。值不限于此范围,小于 -1.0 的值表示在"start"边缘之外,大于 1.0 的值表示在"end"边缘之外。这个值在通过 resolve 方法时会根据文本方向进行规范化。

- `y`:垂直方向上的偏移,取值范围从 -1.0(表示顶部)到 1.0(表示底部)。值不限于此范围,小于 -1.0 的值表示在顶部之上,大于 1.0 的值表示在底部之下。

`AlignmentDirectional` 的属性 `start` 的含义与文本方向有关,例如,在 `TextDirection.ltr` 文本方向下,`start` 为 -1.0 表示左侧边缘,而在 `TextDirection.rtl` 文本方向下,`start` 为 -1.0 表示右侧边缘。

<div id="4-2"></div>

## <a href="#4-2"><font color="#037781">4.2 用法解析</font>

`AlignmentDirectional` 可以在需要处理文本方向的情况下使用。例如:

```dart
Align(
  alignment: AlignmentDirectional(0.0, 0.0), // 在文本方向下水平居中和垂直居中
  child: YourWidget(),
)
  1. AnimatedBuilder 中使用 AlignmentDirectional 创建动画:
AnimationController controller;
Animation<AlignmentDirectional> animation = AlignmentDirectionalTween(
  begin: AlignmentDirectional(-1.0, -1.0),
  end: AlignmentDirectional(1.0, 1.0),
).animate(controller);

AnimatedBuilder(
  animation: animation,
  builder: (context, child) {
    return Align(
      alignment: animation.value.resolve(TextDirection.ltr), // 使用文本方向解析偏移
      child: YourWidget(),
    );
  },
)

也可以使用内置的静态常量来表示不同的偏移位置:

AlignmentDirectional.topStart // 位于文本方向下的左上角
AlignmentDirectional.bottomEnd // 位于文本方向下的右下角

如:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('AlignmentDirectional 示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Container(
                width: 100,
                height: 100,
                color: Colors.blue,
                alignment: AlignmentDirectional.topStart, // 位于文本方向下的左上角
                child: const Text('Top Start'),
              ),
              const SizedBox(height: 20),
              Container(
                width: 100,
                height: 100,
                color: Colors.red,
                alignment: AlignmentDirectional.bottomEnd, // 位于文本方向下的右下角
                child: const Text('Bottom End'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这里插入图片描述

AlignmentDirectional 的使用方式与 Alignment 类似,但它更灵活,可以根据文本方向动态调整水平偏移。这使得它在需要处理国际化和文本方向的应用程序中非常有用。


5. AlignmentGeometryTween 抽象类

AlignmentGeometryTween 是一个抽象基类,它用于表示在两个不同的 AlignmentGeometry 之间创建动画的基本结构。它定义了创建动画所需的方法和属性,但本身无法直接实例化,而是通过其具体的子类来使用。

具体的子类AlignmentTween ,实现了 AlignmentGeometryTween 抽象类,并提供了适用于具体 Alignment 或 AlignmentDirectional 的实现。这些具体的子可以创建特定类型的 Alignment 动画。

6. AlignmentTween组件(对其补间动画)

AlignmentTween 是用于在两个不同的 Alignment 值之间创建动画的类。它是 AlignmentGeometryTween 的一个具体子类,专门用于处理 Alignment 类型的动画效果。AlignmentTween 可以平滑地过渡一个 Alignment 到另一个 Alignment,从而创建流畅的动画效果。

以下是 AlignmentTween 的主要属性和用法:

  • begin:指定动画的起始位置,通常为初始的 Alignment 值。

  • end:指定动画的结束位置,通常为目标的 Alignment 值。

  • lerp 方法:用于在两个不同的 Alignment 值之间插值并创建动画效果。这个方法通常由 Flutter 框架自动调用,无需手动调用。

要创建一个 AlignmentTween 动画,通常按照以下步骤操作:

  1. 创建一个 AlignmentTween 实例,指定起始和结束位置:

    Alignment beginAlignment = Alignment.topLeft;
    Alignment endAlignment = Alignment.bottomRight;
    AlignmentTween alignmentTween = AlignmentTween(begin: beginAlignment, end: endAlignment);
    
  2. 创建一个 AnimationController 以控制动画的执行:

    AnimationController controller = AnimationController(
      duration: Duration(seconds: 2), // 设置动画持续时间
      vsync: this, // 通常用于 State 对象中
    );
    
  3. 使用 alignmentTween.animate(controller) 来生成动画对象:

    Animation<Alignment> animation = alignmentTween.animate(controller);
    
  4. 在需要更新小部件位置的地方使用 AnimatedBuilder 或其他适当的小部件包装,以便在动画过程中更新小部件的位置:

    AnimatedBuilder(
      animation: animation,
      builder: (context, child) {
        return Align(
          alignment: animation.value,
          child: YourWidget(), // 替换为要执行动画的小部件
        );
      },
    )
    
  5. 启动动画,例如在按钮点击或初始化时:

    controller.forward(); // 启动动画
    

这样,就可以使用 AlignmentTween 创建并控制 Alignment 动画,使小部件在不同的对齐位置之间平滑过渡。这对于在 UI 中实现平滑的位置变化效果非常有用。

一个例子:

import 'package:flutter/material.dart';

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

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

  
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyAnimatedWidget(),
    );
  }
}

class MyAnimatedWidget extends StatefulWidget {
  const MyAnimatedWidget({super.key});

  
  State<MyAnimatedWidget> createState() => _MyAnimatedWidgetState();
}

class _MyAnimatedWidgetState extends State<MyAnimatedWidget>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Alignment> _animation;

  
  void initState() {
    super.initState();

    // 创建动画控制器
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    );

    // 创建 AlignmentTween 动画
    Alignment beginAlignment = Alignment.topLeft;
    Alignment endAlignment = Alignment.bottomRight;
    _animation = AlignmentTween(begin: beginAlignment, end: endAlignment)
        .animate(_controller);

    // 启动动画
    _controller.forward();
  }

  
  void dispose() {
    _controller.dispose(); // 释放动画控制器
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('AlignmentTween Animation'),
      ),
      body: Center(
        child: AnimatedBuilder(
          animation: _animation,
          builder: (context, child) {
            return Align(
              alignment: _animation.value,
              child: Container(
                width: 100.0,
                height: 100.0,
                color: Colors.blue,
                child: const Center(
                  child: Text(
                    'Animated',
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

在这里插入图片描述

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

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

相关文章

问题: 视频颜色问题,偏绿

参考 什么是杜比视界&#xff1f; - https://www.youtube.com/watch?vldXDQ6VlC7g 【哈士亓说】07&#xff1a;HDR、杜比视界究竟是个啥&#xff1f;为什么这个视频还不是HDR视频&#xff1f; - https://www.youtube.com/watch?vrgb9Xg3cJns 正文 视频应该是 杜比视界 电…

【C++漂流记】C++对象模型和this指针

C中对象模型和this指针是面向对象编程中的重要概念。对象模型描述了对象在内存中的布局和行为&#xff0c;包括成员变量和成员函数的存储方式和访问权限。this指针是一个隐含的指针&#xff0c;指向当前对象的地址&#xff0c;用于在成员函数中引用当前对象的成员变量和成员函数…

力扣 -- 416. 分割等和子集(01背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {int nnums.size();int sum0;for(const auto& e:nums){sume;}if(sum%21){return false;}int aimsum/2;//多开一行&#xff…

前端页面初步开发

<template><div><el-card class"box-card" style"height: 620px"><el-input v-model"query.name" style"width:200px" placeholder"请输入用户姓名"></el-input>&nbsp&nbsp&nbsp…

cesium 雷达扫描 (线行扩散效果)

cesium 雷达扫描 (线行扩散效果) 1、实现方法 使用ellipse方法加载圆型,修改ellipse中material方法来实现效果 2、示例代码 2.1、 <!DOCTYPE html> <html lang="en"><head><<

[Spring] Spring5——IOC 简介(二)

目录 六、工厂 Bean&#xff08;Factory&#xff09; 1、普通 bean 2、工厂 bean 3、示例 七、Bean 的作用域 1、单例和多例 2、如何设置为单实例或多实例 八、Bean 的生命周期 1、生命周期 2、生命周期示例 3、Bean 的后置处理器 4、后置处理器示例 九、XML 的自…

JavaScript设计模式

✨JavaScript设计模式 &#x1f380;设计模式 在 面向对象软件设计中针对特定问题的简洁而优雅的解决方案 &#x1f390;常见的设计模式 &#x1f384;1. 工厂模式 在JavaScript中&#xff0c;工厂模式的表现形式就是一个调用即可返回新对象的函数 // ------------- 工厂模…

gitlab配置webhook限制提交注释

一、打开gitlab相关配置项 vim /etc/gitlab/gitlab.rb gitlab_shell[custom_hooks_dir] "/etc/gitlab/custom_hooks" 二、创建相关文件夹 mkdir -p /etc/gitlab/custom_hooks mkdir -p /etc/gitlab/custom_hooks/post-receive.d mkdir -p /etc/gitlab/custom_h…

springboot和vue:九、v-for中的key+vue组件化开发

v-for中的key 目的 现在想要实现这样的一种效果&#xff0c;页面上存在初始姓名表单&#xff0c;同时存在输入框&#xff0c;输入姓名后点击添加按钮可以将新输入的姓名加入显示的姓名表单中。 代码 <!DOCTYPE html> <html lang"en"><head><…

数学建模Matlab之数据预处理方法

本文综合代码来自文章http://t.csdnimg.cn/P5zOD 异常值与缺失值处理 %% 数据修复 % 判断缺失值和异常值并修复&#xff0c;顺便光滑噪音&#xff0c;渡边笔记 clc,clear;close all; x 0:0.06:10; y sin(x)0.2*rand(size(x)); y(22:34) NaN; % 模拟缺失值 y(89:95) 50;% 模…

Mars3d的graphic/entity/model示例的glb的ModelEntity修改颜色失效说明

1.Mars3d的graphic/entity/model示例的glb的ModelEntity修改颜色失效说明 2.测试时发现示例的glb的ModelEntity使用setStyle()修改颜色没成功 setTimeout(() > { graphicModel.setStyle({ color: "red" }) }, 500) 相关链接 1.http://mars3d.cn/editor-vue.html?…

使用sqlmap总是提示需要302跳转重新登录的解决方法

如果在命令中不指定cookie&#xff0c;sqlmap在执行时会提示需要重新登录 如果给了cookie但发现还是提示需要重新登录&#xff0c;且按它给的提示发现还是找不到注入点&#xff0c;原因是url没有加引号 url加了双引号后解决问题

MySQL在线修改表结构-PerconaTookit工具

在线修改表结构必须慎重 在业务系统 运行 过程中随意删改字段&#xff0c;会 造成重大事故。 常规的做法是&#xff1a;业务停机&#xff0c;再 维护表结构 比如&#xff1a;12306 凌晨 0 点到早上 7 点是停机维护 如果是不影响正常业务的表结构是允许在线修改的。 比如&…

16数据处理

plotly 设置x/y轴名称 yaxis_title‘金额(元)’,xaxis_title‘日期’ fig px.line(df_grouped, x"Order_time", y"Money", title日销图) fig.update_layout(yaxis_title金额(元),xaxis_title日期, xaxis_tickformat%Y-%m-%d,yaxis_tickformat 0.2f) fig…

多线程案例 - 单例模式

单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…

面试必考精华版Leetcode437. 路径总和 III

题目&#xff1a; 代码&#xff08;首刷看解析&#xff0c;暴力法&#xff09;&#xff1a; class Solution { public:long rootSum(TreeNode* root,long targetSum){if(!root) return 0;long res0;if(root->valtargetSum){res;} resrootSum(root->left,targetSum-root-…

2022年9月及10月

9月 1.Halcon12的HObject和Hobject halcon12 可以用HObject&#xff0c;也可以用Hobject&#xff0c;用法都一样 包括HalconCpp.h 如果附加目录中&#xff1a; C:\Program Files\MVTec\HALCON-12.0\include\halconcpp\ 在前面&#xff0c;则用 HalconCpp::HObject 如果附加目录…

【论文阅读】DiffusionDet: Diffusion Model for Object Detection

原文链接&#xff1a;https://arxiv.org/abs/2211.09788 1. 引言 过去的目标检测方法依赖手工设计的候选对象&#xff08;如滑动窗口、区域提案、锚框和参考点&#xff09;&#xff1b;或是依赖可学习的物体查询。   本文使用更加简单的方法&#xff0c;随机初始化边界框&am…

防火墙基础之H3C防火墙和三层交换机链路聚合的配置

H3C防火墙和三层交换机链路聚合的配置 原理概述&#xff1a; 防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理​与筛选的软件和硬件​设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保…

Docker从认识到实践再到底层原理(七)|Docker存储卷

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…