点击上方 "程序员小乐"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

关注订阅号「程序员小乐」,收看更多精彩内容

每日英文

It doesn't matter what others think of you ,What matters most is How you see yourself.

不要太在意别人如何看待你;最为重要的是你如何看待你自己。

每日掏心话

世间没有不被评说的事,也没有不被猜测的人;依心而行,做真实漂亮的自己。生命是倒计时的;日子是顺着过的;人生是说不清的;命运是猜不透的;辉煌总会来的;霉头总会有的;命是必须信的。

来自:老孟Flutter | 责编:乐乐

链接:live.bilibili.com/21917305

后端架构师(ID:study_tech)第 1084 次推文

往日回顾:再见!Postman

     

   正文   

Flutter 中3D效果是通过Transform组件实现的,没有变换效果的实现:

 class TransformDemo extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('3D 变换Demo'),),body: Container(alignment: Alignment.center,color: Colors.white,child: Text('3D 变换Demo'),),);}
}

通过 GestureDetector 组件添加滑动事件监听:

@override
Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('3D 变换Demo'),),body: GestureDetector(onPanUpdate: (details) {print('$details');},child: Container(alignment: Alignment.center,color: Colors.white,child: Text('3D 变换Demo'),),),);
}

添加 Transform对组件进入旋转:

@override
Widget build(BuildContext context) {return Transform(transform: Matrix4.identity()..setEntry(3, 2, 0.001)..rotateX(pi/6)..rotateY(pi/6),alignment: Alignment.center,child: Scaffold(appBar: AppBar(title: Text('3D 变换Demo'),),body: GestureDetector(onPanUpdate: (details) {},child: Container(alignment: Alignment.center,color: Colors.white,child: Text('3D 变换Demo'),),),));
}

将滑动的偏移和旋转进行关联:

class TransformDemo extends StatefulWidget {@override_TransformDemoState createState() => _TransformDemoState();
}class _TransformDemoState extends State<TransformDemo> {double _rotateX = .0;double _rotateY = .0;@overrideWidget build(BuildContext context) {return Transform(transform: Matrix4.identity()..rotateX(_rotateX)..rotateY(_rotateY),alignment: Alignment.center,child: Scaffold(appBar: AppBar(title: Text('3D 变换Demo'),),body: GestureDetector(onPanUpdate: (details) {setState(() {_rotateX += details.delta.dy * .01;_rotateY += details.delta.dx * -.01;});},child: Container(alignment: Alignment.center,color: Colors.white,child: Text('3D 变换Demo'),),),));}
}

基本已经实现了3D效果,但效果比较生硬,尤其垂直方向旋转的时候远点和近点在屏幕上的宽度是一样,

在公众号程序员小乐回复“Java”,获取Java面试题和答案惊喜礼包。

添加近大远小的效果:

Transform(transform: Matrix4.identity()..setEntry(3, 2, 0.001)..rotateX(_rotateX)..rotateY(_rotateY),...

翻书效果

上面的效果类似于翻书的效果。

实现的原理:

将图片左右切割为两部分,两张图片共分割为4个新的组件,如下图,分别为1、2、3、4

代码实现:

_child1 = ClipRect(child: Align(alignment: Alignment.centerLeft,widthFactor: 0.5,child: child1,),
);
_child2 = ClipRect(child: Align(alignment: Alignment.centerRight,widthFactor: 0.5,child: child1,),
);_child3 = ClipRect(child: Align(alignment: Alignment.centerLeft,widthFactor: 0.5,child: child2,),
);_child4 = ClipRect(child: Align(alignment: Alignment.centerRight,widthFactor: 0.5,child: child2,),
);

将第一张图片放在第二种图片的上面,先旋转 组件2 从 0度到 90度,然后再旋转 组件3 从 -90度到0度,代码实现:

Row(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Stack(children: [_child1,Transform(alignment: Alignment.centerRight,transform: Matrix4.identity()..setEntry(3, 2, 0.001)..rotateY(_animation1.value),child: _child3,),],),Container(width: 3,color: Colors.white,),Stack(children: [_child4,Transform(alignment: Alignment.centerLeft,transform: Matrix4.identity()..setEntry(3, 2, 0.001)..rotateY(_animation.value),child: _child2,)],)],
)

动画控制器设置:

@override
void initState() {init();_controller =AnimationController(vsync: this, duration: Duration(seconds: 5))..addListener(() {setState(() {});});_animation = Tween(begin: .0, end: pi / 2).animate(CurvedAnimation(parent: _controller, curve: Interval(.0, .5)));_animation1 = Tween(begin: -pi / 2, end: 0.0).animate(CurvedAnimation(parent: _controller, curve: Interval(.5, 1.0)));_controller.forward();super.initState();
}

其中 child1, child2为两种图片,代码如下:

_FlipUpDemoState(Container(width: 300,height: 400,child: Image.asset('assets/images/b.jpg',fit: BoxFit.cover,),),Container(width: 300,height: 400,child: Image.asset('assets/images/c.jpeg',fit: BoxFit.cover,),))

最后生成的效果就是开始的翻书效果。

上面是左右翻页效果,同理换成上下翻页效果:

@override
Widget build(BuildContext context) {return Scaffold(appBar: AppBar(),body: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Stack(children: [_upperChild1,Transform(alignment: Alignment.bottomCenter,transform: Matrix4.identity()..setEntry(3, 2, 0.003)..rotateX(_animation1.value),child: _upperChild2,),],),SizedBox(height: 2,),Stack(children: [_lowerChild2,Transform(alignment: Alignment.topCenter,transform: Matrix4.identity()..setEntry(3, 2, 0.003)..rotateX(_animation.value),child: _lowerChild1,)],)],),);
}

PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

欢迎加入后端架构师交流群,在后台回复“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

员工踩点上下班被HR约谈,网友:按时上下班,天经地义

CTO说:Service层的接口是不是多此一举

Java实现单链表、栈、队列三种数据结构

BAT面试经验总结

在下面公众号后台(非本号),回复关键字「手册」获取

嘿,你在看吗

Flutter实现3D效果,一个字,炫!相关推荐

  1. Flutter 绘制 3D 效果动画

    前言 本篇我们继续介绍 Flutter 绘图的 Path 的应用.Flutter 的 Path 类提供了一个三维空间的变换方法,可以实现路径在三维空间的平移.旋转等操作,从而可以实现3D 绘制的效果. ...

  2. 滑动翻页效果_Flutter实现3D效果,一个字,炫!

    老孟的博客地址: http://laomengit.com/ Flutter 中3D效果是通过Transform组件实现的,没有变换效果的实现: class TransformDemo extends ...

  3. Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面

    本文主要介绍如何使用 Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面 我将向您展示如何使用 Flutter 制作一个具有酷炫液体滑动效果的酷炫入门页面,所以不用多说,让我们开始吧.在本课程 ...

  4. 超炫酷的3D效果电子书阅读器3DBook绿色版下载

          很多人喜欢在电脑上看小说,但每天用Windows的记事本来看那些TXT电子书,总觉得没有书本的那种感觉,看起来总是差了点什么.今天异次元给大家介绍一款非常酷非常漂亮的3D效果的电子书阅读器 ...

  5. 一篇文章搞定css3 3d效果

    css3 3d学习心得 卡片反转 魔方 banner图 首先我们要学习好css3 3d一定要有一定的立体感 通过这个图片应该清楚的了解到了x轴 y轴 z轴是什么概念了. 首先先给大家看一个小例子: 卡 ...

  6. 电商C4D设计素材背景,3D效果是最适合电商产品

    在电商行业工作过一段时间的美工设计师们应该都会有这样的切身体会,那就是行业的视觉要求越来越高,人力抠图套模板已经淘汰了,并且随着官方提供出AI智能作图工具的使用,未来的趋势一定是简单的促销海报图和基础 ...

  7. java实现3D动态效果_js实现3D粒子酷炫动态旋转特效

    js实现3D粒子酷炫动态旋转特效(效果比较酷炫,中途不仅有形态的变换,还有颜色的变化,希望大家能够喜欢) 代码实现过程中的静态截图 New Document html,body{ margin:0px ...

  8. css3图片倾斜3D效果

    css3图片倾斜3D效果 这是一款非常炫酷图片3D倾斜动画,响应式的图片列表布局,鼠标悬停图片3D倾斜遮罩显示标题图标效果. 演示地址 下载地址

  9. 怎么使用Photoshop软件3D功能设计出炫彩海报

    本文由:"学设计上兔课网"原创,图片素材来自网络,仅供学习分享 怎么使用Photoshop软件3D功能设计出炫彩海报 教程效果图: 方法是使用了PS里面的3D功能,一句话介绍方法就 ...

最新文章

  1. Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)
  2. vue 引入的方法 用在template_?【有手就行】轻松打造属于自己的Vue工程化脚手架工具...
  3. java数据结构-HashMap
  4. 【学时总结】 ◆学时 · I◆ A*算法
  5. 【Flink】Flink 基于 MailBox 实现的 StreamTask 线程模型
  6. ActiveMQ学习总结(7)——ActiveMQ使用场景
  7. Jquery 选择器 特殊字符 转义字符
  8. 怎么自动响应richTextBox超级链接单击click事件
  9. 如何制定自动化测试战略?10年经验让我考虑这些关键要素!
  10. 文件上传------c#
  11. python统计字典中元素个数_Python计数器 | collections.Counter
  12. NYOJ题目1170-最大的数
  13. 面试之MySQL调优问题
  14. 《缠中说禅108课》61:区间套定位标准图解(分析示范六)
  15. Python的运行加速:C究竟比python快在哪
  16. win10无线网卡启动服务器,win10系统无线网卡被禁用怎么办?win10开启无线网卡的方法...
  17. Carthagecocopads 摘抄笔记
  18. 全网最通俗易懂的「插屏广告」接入方法
  19. uniapp文档常用整理
  20. 【爬虫实战】12306购票抓包分析以及任务分解

热门文章

  1. 案件流程 行政争议 行政案件 重点人员 公安案件线索挖掘
  2. r语言怎么把txt数据变成一个Rdata格式_BIOM:生物观测矩阵——微生物组数据通用数据格式...
  3. 大面积皮肤烧伤后留下的增生疤痕可以完全修复吗
  4. php写个发红包_使用PHP编写发红包程序
  5. 小米4刷android wear,小米手表第四次OTA升级:最强安卓手表迎来全新功能+百款表盘...
  6. bitnami忘记登录密码
  7. 【洛谷P5303】【GXOI/GZOI2019】—逼死强迫症(斐波那契数列)
  8. html界面原型,进行 Web 界面原型设计的一种方法 - JunChen Wu
  9. 微软IE7.0放弃正版验证 盗版XP侥幸过关
  10. java中用来抛出异常的关键是_java中用来抛出异常的关键字是 catch