【绘制 widget】Flutter FractionalTranslation

简介: 【绘制 widget】Flutter FractionalTranslation

image.png


大家好,我是 17。今天的每日 widget 为大家介绍 FractionalTranslation。

FractionalTranslation 可以按比例偏移 child,在 Animation 的加持下,可以实现直线滑动的动画效果,比如 SlideTransition 就是这样实现的动画效果。

FractionalTranslation 介绍

FractionalTranslation 继承自 SingleChildRenderObjectWidget。renderObject 是 RenderFractionalTranslation 类的实例。RenderFractionalTranslation extends RenderProxyBox 没有 override PerformLayout 方法,所以布局方面没有什么建树。 如果有 child,透传 Constrains 给 child,size 和 child 一样大。他的能力是在绘制阶段完成的。

源码分析

@override
  void paint(PaintingContext context, Offset offset) {
    assert(!debugNeedsLayout);
    if (child != null) {
      super.paint(
          context,
          Offset(
            offset.dx + translation.dx * size.width,
            offset.dy + translation.dy * size.height,
          ));
    }
  }
复制代码

逻辑还是很简单的,就是绘制的时候在 x 轴方向加上偏移  translation.dx * size.width ,在 y 轴方向加上偏移 translation.dy * size.height

@override
  bool hitTest(BoxHitTestResult result, {required Offset position}) {
    return hitTestChildren(result, position: position);
  }
 @override
 bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {
    assert(!debugNeedsLayout);
    return result.addWithPaintOffset(
      offset: transformHitTests
          ? Offset(translation.dx * size.width, translation.dy * size.height)
          : null,
      position: position,
      hitTest: (BoxHitTestResult result, Offset position) {
        return super.hitTestChildren(result, position: position);
      },
    );
}
复制代码

FractionalTranslation 能否通过点击测试完全取决于 child。

transformHitTests 为 false,点击 child 溢出的部分不会通过 hitTest。

transformHitTests 为 true,对 dx,dy 做了偏移,抵消掉了绘制的时候 child 偏移的影响。 点击 child 溢出的部分会通过 hitTest。

使用 FractionalTranslation

image.png

Center(
child: Container(
    foregroundDecoration:
        BoxDecoration(border: Border.all(color: Colors.red)),
    child: FractionalTranslation(
      transformHitTests: true,
      translation: Offset(0.5, 0),
      child: GestureDetector(
          onPanDown: (details) {
            print(
                '${details.globalPosition}--${details.localPosition}');
          },
          child: Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          )),
)));
复制代码

红色部分是 FractionalTranslation 的 size,大小为 Size(100,100),参数 Offset(0.5, 0) 让 child 向右偏移 100*0.5= 50。偏移的值也可以为负,比如 Offset(-0.5, 0) 就会向左偏移 50。

虽然在视觉上 child 超出右边 50,但是所占的位置 在 layout 阶段就已经确定了,所以无论 child 如何偏移,FractionalTranslation 所占的位置都是红框部分。

参数 transformHitTests 会影响到 localPosition 。如果为 true(默认值)localPosition 的值是相对于 child 的左上角的。否则相对于 FractionalTranslation 的左上角。transformHitTests 对 globalPosition 没有影响。

关于点击范围

FractionalTranslation size 内的 child 是可以点击的,只要父级的 size 都包含了 child。溢出的部分能否点击取决于父级的 size 是多大 并且 FractionalTranslation 的参数 transformHitTests: true。只要所有的父级都包含了 child 溢出的部分,溢出的部分也是可以点击的。因为点击测试是从顶层向下层发起的,进行深度优先遍历,如果pointerEvent 在上层某个 widget 的 size 之外,那么在上层就不会再调用 child 的 hitTest,下面的 children 就没有机会参加 hitTest,当然也就没有机会通过 hitTest 了。

IAM17
+关注
目录
打赏
0
0
0
0
1
分享
相关文章
了解 Flutter 的 Timer 类和 Timer.periodic【Flutter 专题 19】
在构建移动应用程序时,我们经常会遇到必须在一定时间后执行任务的场景。还记得在进入应用程序之前看到闪亮的启动画面吗? 或者我们可能需要一段代码在一段时间后重复执行,比如显示剩余时间限制以填充一次性密码或每秒更改小部件的颜色以创建漂亮的动画。
5758 0
|
9月前
|
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
本文介绍了如何开发一个 Flutter 鸿蒙插件,实现 Flutter 与鸿蒙的混合开发及双端消息通信。通过定义 `MethodChannel` 实现 Flutter 侧的 token 存取方法,并在鸿蒙侧编写 `EntryAbility` 和 `ForestPlugin`,使用鸿蒙的首选项 API 完成数据的读写操作。文章还提供了注意事项和参考资料,帮助开发者更好地理解和实现这一过程。
391 0
Flutter&鸿蒙next 实现长按录音按钮及动画特效
本文介绍了如何在 Flutter 中实现一个带有动画效果的长按录音按钮。通过使用 `GestureDetector` 监听长按手势,结合 `AnimatedContainer` 和 `AnimationController` 实现按钮的动画效果,以及 `flutter_sound` 插件完成录音功能。文章详细讲解了功能需求、实现思路和代码实现,帮助读者逐步掌握这一实用功能的开发方法。
296 5
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
error: Failed dependencies: mariadb-connector-c-config is obsoleted by mysql-community-server-8.0.36-1.el7.x86_64 问题解决
665 19
api接口如何对接?(带你了解api接口的相关知识)
API接口是在产品和研发领域广泛应用的专业术语,主要用于公司内部系统衔接及公司间合作。本文将详细讲解API接口的概念、必要性及其核心要素。首先介绍API接口的基本原理与应用场景,随后阐述其重要性,最后解析API接口的核心组成部分,帮助读者深入理解API接口的工作机制。适合产品小白和求职者阅读,提升专业知识。
|
11月前
好看简单的Login登录界面,背景色带渐变
好看简单的Login登录界面,背景色带渐变
448 2
36. 【Android教程】侧滑菜单:DrawerLayout
36. 【Android教程】侧滑菜单:DrawerLayout
246 1
构建高效Android应用:采用Kotlin协程优化网络请求
【5月更文挑战第31天】 在移动开发领域,尤其是针对Android平台,网络请求的管理和性能优化一直是开发者关注的焦点。随着Kotlin语言的普及,其提供的协程特性为异步编程提供了全新的解决方案。本文将深入探讨如何利用Kotlin协程来优化Android应用中的网络请求,从而提升应用的响应速度和用户体验。我们将通过具体实例分析协程与传统异步处理方式的差异,并展示如何在现有项目中集成协程进行网络请求优化。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问