内容简介:最近通过一篇博客学习了Flutter中的3D透视效果。效果是跟随手指的触摸,界面做3D转动。主要用到了
最近通过一篇博客学习了Flutter中的3D透视效果。
效果是跟随手指的触摸,界面做3D转动。
// v2: add Gesture detector import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Perspective', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key}) : super(key: key); // changed @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { Offset _offset = Offset.zero; // changed @override Widget build(BuildContext context) { return Transform( // Transform widget transform: Matrix4.identity() //生成一个单位矩阵 ..setEntry(3, 2, 0.001) // 透视 ..rotateX(0.01 * _offset.dy) // changed ..rotateY(-0.01 * _offset.dx), // changed alignment: FractionalOffset.center, child: GestureDetector( // new onPanUpdate: (details) => setState(() => _offset += details.delta), //与屏幕接触并移动的指针再次移动 onDoubleTap: () => setState(() => _offset = Offset.zero), child: _defaultApp(context), )); } _defaultApp(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( '3D效果', ), ], ), ), ); } } 复制代码
主要用到了 Transform
。 Transform
是用来做矩阵变换的。
首先通过 Matrix4.identity()
来生成一个单位矩阵。然后通过 ..setEntry(3, 2, 0.001)
来将矩阵的第3行第2列设置为0.001。作用是类似设置物体到摄像机的距离,越远物体看起来越小,越近看起来物体越大。
..rotateX
和 ..rotateY
是分别修改XY轴的数值,这里乘0.01是做了一个数值压缩。(因为是以Z轴为轴做旋转,所以改变的是X和Y轴的值,Z轴是垂直于屏幕方向的轴)。
最后通过 GestureDetector
部件获取手指移动的距离,并添加双击复位操作。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Four
Scott Galloway / Portfolio / 2017-10-3 / USD 28.00
NEW YORK TIMES BESTSELLER USA TODAY BESTSELLER Amazon, Apple, Facebook, and Google are the four most influential companies on the planet. Just about everyone thinks they know how they got there.......一起来看看 《The Four》 这本书的介绍吧!