Flutter InteractiveViewer 支持平移和缩放子Widget

在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。


1 InteractiveViewer 是什么 ?

InteractiveViewer 是Flutter 中一个可以将子Widget进行平移与缩放操作的 Widget,用户可以通过拖动进行平移或者双指捏放来放大来子元素。

2 基本使用

如对一个图片的双指捍合放大

void main() => runApp(MaterialApp(
      home: TestPage(),
    ));

class TestPage extends StatefulWidget {
  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      ///填充布局
      body: Center(
        child: InteractiveViewer(
          alignPanAxis: false,
          //对子Widget 进行缩放平移
          child: Image.asset("assets/images/banner1.webp"),
        ),
      ),
    );
  }
}
3 InteractiveViewer 属性详细说明
  InteractiveViewer({
    Key? key,
    this.alignPanAxis = false,
    this.boundaryMargin = EdgeInsets.zero,
    this.constrained = true,
    // These default scale values were eyeballed as reasonable limits for common
    // use cases.
    this.maxScale = 2.5,
    this.minScale = 0.8,
    this.onInteractionEnd,
    this.onInteractionStart,
    this.onInteractionUpdate,
    this.panEnabled = true,
    this.scaleEnabled = true,
    this.transformationController,
    required this.child,
  })

maxScale属性用来设置最大缩放比例,minScale用来设置最小缩放比例。

3.1 alignPanAxis

默认为 false ,子Widget可以沿任意方向平移,如果设置为true,对角线平移是不允许的,也就是说只能沿一个方向平移,如果开始平移为水平方向则在本次手指抬起前只能是水平移动,竖直方向的移动同理。

3.2 boundaryMargin

平移边缘距离,默认为EdgeInsets.zero,四个边缘为0,如下图平移无边缘出现
在这里插入图片描述
当配置为 EdgeInsets.all(20) 时,效果如下图所示:

在这里插入图片描述

3.3 constrained 属性

用来设置 是否约束子 Widget ,默认为true,也就是 InteractiveViewer 的大小会强加给子Widget的大小约束,如果设置为 false ,则可理解为是 InteractiveViewer 包裹子Widget.

3.4 InteractiveViewer 手势监听与回调
InteractiveViewer(
   //对子Widget 进行缩放平移
   child: Image.asset("assets/images/banner1.webp"),
   //结束平移与缩放的回调
   onInteractionEnd: (ScaleEndDetails details) {},
   //开始平移与缩放的回调
   onInteractionStart: (ScaleStartDetails details) {},
   //平移或者是缩放过程中的回调
   onInteractionUpdate: (ScaleUpdateDetails details) {},
 )

完毕

为了实现一个具有3D旋转效果的交互式动画,我们需要对Transform组件GestureDetector的使用有深入的理解。Transform组件允许我们在二维空间内对小部件应用2D3D变换,而GestureDetector则可以用来捕捉用户的触摸手势动作。以下是具体的实现步骤代码示例: 参考资源链接:[Flutter实现3D动画实例:打造酷炫视觉体验](https://wenku.csdn.net/doc/40fxo0w1e8) 首先,我们创建一个基础的Flutter应用,引入必要的包组件: ```dart import 'package:flutter/material.dart'; ``` 然后,在`StatelessWidget`的`build`方法中,我们可以定义一个包含GestureDetectorTransform组件的容器: ```dart class Transform3DAnimation extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('3D旋转动画示例'), ), body: Center( child: InteractiveViewer( panEnabled: true, child: GestureDetector( onPanUpdate: (details) { // 这里可以根据滑动手势动态更新旋转角度 double rotates = details.delta.dx * 0.01; // 示例:根据水平滑动距离旋转 setState(() { _rotation = _rotation + rotates; }); }, child: Transform( alignment: Alignment.center, transform: Matrix4.identity() ..setEntry(3, 2, 0.001) // 设置透视效果 ..rotateX(0.5) // x轴旋转 ..rotateY(_rotation), // 根据手势动态旋转y轴 child: Container( height: 200.0, width: 200.0, color: Colors.blue, child: Center( child: Text('3D Rotate', style: TextStyle(color: Colors.white)), ), ), ), ), ), ), ); } double _rotation = 0.0; } ``` 在这段代码中,我们首先定义了一个`Transform3DAnimation`组件。在`GestureDetector`中监听用户的滑动事件,根据滑动的距离动态调整旋转角度`_rotation`。`Transform`组件使用`Matrix4`来实现3D变换,我们通过设置`.rotateX``.rotateY`来实现物体的3D旋转效果,并通过`Matrix4.setEntry(3, 2, 0.001)`来模拟透视效果,增强3D感。 为了完善动画体验,我们还引入了`InteractiveViewer`组件,它可以增强手势交互的流畅性,允许用户在容器内进行缩放平移操作,从而更自然地与3D效果交互。 在实际开发中,你可以根据需要调整旋转角度、旋转轴透视参数,以达到最佳的视觉效果。如果你希望深入学习更多关于Flutter中的3D效果动画实现,建议阅读《Flutter实现3D动画实例:打造酷炫视觉体验》。这份资源不仅提供了理论基础示例代码,还详细介绍了交互式3D动画的实现过程,以及如何在实际项目中应用这些技术点。 参考资源链接:[Flutter实现3D动画实例:打造酷炫视觉体验](https://wenku.csdn.net/doc/40fxo0w1e8)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早起的年轻人

创作源于分享

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值