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

老孟的博客地址:
http://laomengit.com/
079ddfe9d00ff2777acc9382d68bc712.gifFlutter 中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'),
      ),
    );
  }
}
387c4ab08f593e5d7535e80a32e2f302.png通过 GestureDetector 组件添加滑动事件监听:
@overrideWidget 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对组件进入旋转:
@overrideWidget 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'),
          ),
        ),
      ));
}
a9567d1708a36d71bffeacb49d61fdcd.png将滑动的偏移和旋转进行关联:
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'),
            ),
          ),
        ));
  }
}
e98f40cbd6e71407d8a2898e1162b3b6.gif基本已经实现了3D效果,但效果比较生硬,尤其垂直方向旋转的时候远点和近点在屏幕上的宽度是一样,49fccc7276062e26eaba5f26a5d4c117.png添加近大远小的效果:
Transform(
    transform: Matrix4.identity()
      ..setEntry(3, 2, 0.001)
      ..rotateX(_rotateX)
      ..rotateY(_rotateY),
  ...
d82a4407799b248178abefb2dae53275.png翻书效果691d451da9d9001bfebabeaaeee18065.gif上面的效果类似于翻书的效果。实现的原理:将图片左右切割为两部分,两张图片共分割为4个新的组件,如下图,分别为1、2、3、484f8b93f5feeb56e8a1269aab27f0e57.png代码实现:
_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: [
    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,
        )
      ],
    )
  ],
)
动画控制器设置:
@overridevoid 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: [
        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,
            )
          ],
        )
      ],
    ),
  );
}
ffe70a3027b0151e4e4d488db8b37cc6.gif

关注我获取更多知识或者投稿

05beafa18877fa8772a6f279524b15f0.png

10fa15810cc0a3ab77788c2aceb5c7c0.png

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

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

相关文章

overleaf 插入图片_latex中插入图片

latex排版之插入图片&#xff1a;在排版图片之前&#xff0c;个人认为不管用不用到&#xff0c;引入下面两个包&#xff1a;\usepackage{graphicx}\usepackage{subfigure}(1)插入单个图片&#xff0c;图片格式为png\begin{figure}[h]\centering\includegraphics[width4cm,heigh…

debian命令乱码_Debian 9.5 解决中文显示乱码

一.首先检查LOCALE情况说明&#xff1a;DEBIAN因为基于GNU所以&#xff0c;对不同地域进行了不同的包支持&#xff0c;以LOCALE形式存在。1、启动终端#apt-get install locales2、重新配置LOCALE#dpkg-reconfigure locales在界面中我勾选的是“en_US.UTF-8”和“zh_CN.UTF-8”。…

ssh 连接mysql_mysql命令行客户端如何通过ssh服务器连接数据库啊?

ssh到跳板机然后用 mysql 连接利用ssh开启一个隧道我这里的MySQL服务器是192.168.41.83, 我要在192.168.41.72连接首先在192.168.41.72执行命令开启隧道[rootmysql-test-72 ~]# ssh -NPf -o StrictHostKeyCheckingno root192.168.41.83 -L 3305:127.0.0.1:3306root192.168.41.8…

mysql 创建 数据库失败_MySQL创建数据库失败

如果使用root账号登录到数据库create database时提错错误&#xff1a;MySQL: 1006 - Can‘t create database ‘***‘ (errno: 13)或MySQL: 1006 - Can‘t create database ‘***‘ (errno: 28)&#xff0c;一般是mysql用户没有目录权限的问题。先用Linux指令 : ls -ld 查看d…

mysql 客户服务号_mysql客户端及服务端常用实用工具功能总结

一、MySQL服务器端实用工具程序&#xff1a;1、mysqld&#xff1a;SQL后台程序(即MySQL服务器进程)&#xff0c;客户端通过该服务连接服务器来访问数据库。2、mysqld_safe&#xff1a;服务启动脚本。mysqld_safe增加了一些安全特性&#xff0c;如当出现错误时重启服务器并向错误…

MySQL8怎么设置时区为东八区_mysql时区设置为东八区

场景:后台返回给页面的时间统一差8小时。 分析:差八小时,应该是时区问题。具体的是哪一层出的问题呢,mybatis?mysql?系统时间? 解析: 1.查询mysql时区(正常) 输入show variables like "%time_zone%";,显示当前时区 全局参数system_time_zone 系统时区,在My…

mysql网络异常_mysql运行过程中因网络或者数据库原因导致的异常

1、异常信息:The driver has not received any packets from the server异常栈&#xff1a;原因&#xff1a;此异常为jdbc自身的超时限制&#xff0c;一般为应用调用jdbc的API设置了queryTimeout超时限制&#xff0c;当成功获取数据库连接执行sql的时候与mysql服务端断开&#…

mysql撤销用户授权_mysql用户授权及撤销

mysql数据库服务在不做授权的情况下只允许数据库管理员从数据库服务器本机登录。默认只有数据库管理员从数据库服务器本机登录才有授权权限mysql -u root -p (本机登录mysql服务器)mysql -u root -h 192.168.4.5 -p (远程连接mysql服务器)方式1 在库外重置数据库管理员密码&…

js清空文本框的值_一个Vue.js实例控制字变大变小,含样式操作,flex布局。「603」...

这是一个用vue.js对css操作完成的实例。当然用了flex简单布局。一、先创建一个html文件&#xff0c;记得添加vue库文件。二、创建一盒容器vmdiv&#xff0c;用vue绑定它&#xff0c;测试vue绑定后的插入值text1效果。三、加入文本框和两个按钮。四、通过flex排序&#xff0c;让…

Linux mysql.plugin_Linux下MySQL安装

博主邮箱www.zzherfoxmail.com qq&#xff1a;11024719111 //获得以下所需的源代码包(文末附有安装包)&#xff0c;并存放在/usr/local/src2 //与mysql相关&#xff1a;3 boost_1_59_0.tar.gz cmake-3.6.2.tar.gz mysql-5.7.16.tar.gz45 //安装cmake前的依赖包的安装6 //检查gc…

mysql mybatis 工具类_我肝了一个星期,为你们整理出了mybatis程序配置教程

1、搭建实验数据库我们创建一个mybatis实验数据库&#xff0c;并创建一个user表为后续实验准备2、IDEA新建项目&#xff0c;连接数据库新建一个普通的maven项目删除src目录&#xff0c;作为父工程pom.xml中导入相关的maven依赖1、 MySQL驱动2、 MyBatis驱动3、 junit驱动连接我…

python access 源码_连接的微软Access数据库,这是一个轻量级的Python模块(MDB格式)...

A lightweight python module to connect Microsoft Access Database. the module is to use ADO engine through Win32 COM. the module need another Win32 API module, you can find it at the below url:Pyminiado是一个轻量级的Python访问Access数据库的接口&#xff0c;单…

mysql gt resource_实用干货,MYSQL这么用就对啦

本文主要梳理了 SQL 的基础用法&#xff0c;会涉及到以下方面内容&#xff1a;SQL大小写的规范数据库的类型以及适用场景SELECT 的执行过程WHERE 使用规范MySQL 中常见函数子查询分类如何选择合适的 EXISTS 和 IN子查询了解 SQLSQL 是我们用来和数据打交道的方式之一&#xff0…

python 查看当前目录_Python学习第156课--ls的运用、环境变量以及PATH

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】之前简单的介绍了Linux中几个简单的命令。这节再深入一点介绍下 ls 的运用。lsls相当于是list的简写&#xff0c;它的作用是把我们当前目录中的文件列举出来。ls -l把当前目录下的文件以及它的具体信息列举出来…

python对数组的操作_Python对数组的基本操作

# codingutf-8Created on 2014-3-29author: Administrator创建并打印数组arr ["aex", "bfe", "mpilgrim", "zddd", "example"];print(arr);#[aex, bfe, mpilgrim, zddd, example]print(arr[2]);#mpilgrim数组的负索引li[-n…

python菜单函数_Python 自学笔记- 列表及其内置函数

0. 列表都可以存放一些什么东西&#xff1f;我们可以说Python 的列表是一个打了激素的数组&#xff0c;如果把数组比喻成集装箱&#xff0c;那么 Python 的列表就是一个大仓库&#xff0c;Ta 可以存放我们已经学习过的任何数据类型。mix [1,"张三",3.14, [1,"李…

按120分计算成绩 mysql_Mysql实用教程试卷B.doc

.上 装 订 线系名&#xff1a; 班级&#xff1a; 姓名&#xff1a; 学号&#xff1a; 考试日期&#xff1a;下 住 装 订 线河南教育学院2014—2015学年第二学期期末考试软件学院2014级计算机信息管理专业普通专科班《MySQL实用教程》试卷B卷题号一二三四总分分数得分评卷人一、…

java double==Double_java之double类型数值的比较

先看demo:public classL26 {/***paramargs*/public static voidmain(String[] args) {//TODO Auto-generated method stub//double a 300000;double x 300000.00000000003;//double比较&#xff0c;小数点后有效位double y 300000.000000000003;//主要注意的是double类型直接/&…

莫烦python博客_《莫烦Python》笔记 -- numpy部分

个人感觉&#xff0c;在numpy里&#xff0c;从说法上&#xff0c;数组与矩阵可以互换1.1 numpy & pandas有什么用&#xff1f;1.2 numpy & pandas的安装安装Anaconda2.1 numpy属性import numpy as np# 将一个列表转化为矩阵array np.array([[1,2,3],[2,3,4]])# 查看矩…

java 内存情况_java查看jvm内存使用情况

java查看jvm内存使用情况(2012-03-22 15:50:54)标签&#xff1a;jvm内存虚拟机分配itjava.lang.Runtime类提供了查看当前JVM内存的使用情况。每个java实例(即虚拟机实例)只有一个Runtime的实例&#xff0c;通过Runtime.getRuntime()可以得到当前虚拟机中的Runtime实例对象。Run…