滑动翻页效果_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,一经查实,立即删除!

相关文章

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服务端断开&#…

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

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

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

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

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》笔记 -- 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…

java 密码生成器_Java课程设计-随机密码生成器

1.团队课程设计博客链接2.个人负责模板设计程序运行界面&#xff0c;数据的输入&#xff0c;判断数据输入类型的错误&#xff0c;判断密码类型是否选择。3.自己的代码提交记录截图4自己负责模块或任务详细说明(一)总体设计1.系统主要功能(1)输入生成密码长度&#xff1b;(2)判断…

pyecharts本地文件_python数据可视化-pyecharts插件使用文档

pyecharts是百度开源的可视化插件&#xff0c;可以将设计的可视化图表以html格式保存&#xff0c;配合jupyter可以一键生成动态的html数据分析报告。pyecharts和matplotlib的区别在于&#xff0c;pyecharts有更加强大交互的可视化和嵌入html的功能&#xff0c;pyecharts缺点在于…

gdal获取像元的灰度值java_GDAL利用地理坐标读取图像像元值

最近的一个项目需要在电子海图中下载已知水深点&#xff0c;导出点的地理坐标(经纬度)。然后在arcgis中打开这些地理坐标输出为shp&#xff0c;利用GDAL读取不同波段的点对应的像元值&#xff0c;从而构建水深和像元值的对应关系。其实想要根据经纬度得到像元值有两种方法。1.通…

kibana java script_Elasticsearch:创建 Runtime field 并在 Kibana 中使用它 - 7.11 发布 - TGCode...

在之前的文章 “Elasticsearch&#xff1a;使用 Runtime fields 对索引字段进行阴影处理以修复错误 – 7.11 发布”&#xff0c;我展示了如何使用 runtime field 来 shadow 一个已有的在 mapping 中的字段&#xff0c;比如 duration。在今天的练习中&#xff0c;我将展示如何创…

java根据uml图写出实现代码,根据java代码生成UML图

根据java代码生成UML图根据java代码生成UML图这里介绍一个简单易用的eclipse插件ModelGoon&#xff0c;用来对已有代码生成UML图&#xff0c;下面以之前文章中的spring mvc工程为例如何安装和使用这个插件&#xff1b;这个spring mvc工程的代码在githbu上&#xff0c;地址是&am…

highcharts php 动态数据,php动态传数据到highcharts的方法

本文主要介绍了通过php动态传数据到highcharts的相关知识。具有很好的参考价值。1&#xff1a;在平时工作中&#xff0c;在对数据进行展示的时候&#xff0c;是直接通过后台提供的接口来获取json串&#xff0c;用来展示。今天别人问怎么在本地演示一下请求的动态数据。2&#x…

php tar.gz文件,PHP解压tar.gz格式文件的方法,_PHP教程

PHP解压tar.gz格式文件的方法&#xff0c;本文实例讲述了PHP解压tar.gz格式文件的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1、运用php自带压缩与归档扩展(phar)$phar new PharData(song.tar.gz);//路径 要解压的文件 是否覆盖$phar->extractTo(c:/tmp,…

创建数组表格PHP苹果价格,如何从PHP数组创建HTML表?

Cats萌萌这是我的&#xff1a;<?php function build_table($array){ // start table $html . htmlspecialchars($key) . . htmlspecialchars($value2) .

python打包exe报错编码问题,使用Python打包含有pymssql成exe所躺的坑

一、如何打包Python打包exe文件简单运用pyinstaller库就行了1)安装pyinstaller库(自行安装)2)winR打开运行窗口输入“powershell”3)输入pyinstaller -F 路径\文件名.py(打包py文件的路径&#xff0c;py不能省略)看到successfully即为打包成功&#xff0c;但不一定能运用的&…

php超大树形分页,PHP+MySql千万级数据limit分页优化方案

PHPMySql千万级数据limit分页优化方案1年前阅读 2750评论 0喜欢 0### 原因徒弟突然有个需求&#xff0c;就是他发现limit分页&#xff0c;页数越大之后&#xff0c;mysql的消耗越大&#xff0c;查询时间越长&#xff0c;当突破百万级数据之后&#xff0c;一个简单的翻页都需要5…

linux自启动配置文件,Linux中如何设置服务自启动?

有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务&#xff0c;主要用三种方式进行这一操作&#xff1a;ln -s 在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0&#xff5e;6七个运行级别之一)chkonfig 命令行运行级别设置nts…