Android Flutter实现图片滑动切换效果


Posted in Java/Android onApril 07, 2022

前言

我们开始来介绍转换类的动画组件,实际上这类转换动画组件也可以自己通过 AnimatedBuilder 或 AnimatedWidget 完成, Flutter 为了简化开发,提供了不少转换动画组件,这类组件通常命名为 xxTransition。本篇要介绍的就是 SlideTransition,顾名思义,就知道是滑动转换动画。我们本篇来实现两张小姐姐图片的滑动切换,效果如下图所示。

Android Flutter实现图片滑动切换效果

SlideTransition 介绍

SlideTransition 实际上是 AnimatedWidget 子类,其构造方法定义如下:

const SlideTransition({
  Key? key,
  required Animation<Offset> position,
  this.transformHitTests = true,
  this.textDirection,
  this.child,
})

其中 position 是关键参数,它表示一个位置偏移的动画,实际上就是通过修改子组件的位置偏移量来完成滑动动画效果的。回顾一下我们 AnimatedWidget 的使用的介绍:Flutter 怎么实现3D 动画效果?只要我们通过一个 AnimationController 控制 Animation 对象就可以实现动画的控制。使用 SlideTransition 也是一样。我们想要实现组件滑动,那就使用 AnimationController 控制一个 Animation<Offset> 对象就可以了。这里需要注意,position 设定的位置是一个比例参数,即位置是子组件的尺寸乘以 Offset 对象的值。

new_x = width * dx;
new_y = height * dy;

比如我们想让组件从左边滑入,那么可以设置 dx 为负值;而如果是想从右边滑入,那么可以设置 dx 为正值。同理,想上滑入或下滑入也是一样,只是调整 dy 的值就可以了。而通过 dx 和 dy 的组合,就可以实现斜线方向的滑入滑出效果了。

示例效果实现

示例动效实际上我们使用的是一个 Stack 组件,将两张图片分别作为两个 SlideTransition 的子组件层叠在一起。而把那张未出现的图片的初始横向位置设置在左侧显示区域外。当启动动画的时候,之前显示的图片的横向位置调整到右侧显示区域外,从而实现右侧滑出效果;原先在左侧显示区域外的图片的横向位置调整到0,使得占据之前图片的位置,从而实现左侧滑入的效果。点击按钮的时候,就是控制 AnimationController 的forward方法驱动动画,然后再次点击到时候调用 reverse 方法恢复即可。代码如下:

class SlideTransitionDemo extends StatefulWidget {
  SlideTransitionDemo({Key? key}) : super(key: key);

  @override
  _SlideTransitionDemoState createState() => _SlideTransitionDemoState();
}

class _SlideTransitionDemoState extends State<SlideTransitionDemo>
    with SingleTickerProviderStateMixin {
  bool _forward = true;
  final begin = Offset.zero;
  // 第一张图片结束位置移出右侧屏幕
  final end1 = Offset(1.1, 0.0);
  // 第二张图片的初始位置在左侧屏幕
  final begin2 = Offset(-1.1, 0.0);
  late Tween<Offset> tween1 = Tween(begin: begin, end: end1);
  late Tween<Offset> tween2 = Tween(begin: begin2, end: begin);

  late AnimationController _controller =
      AnimationController(duration: const Duration(seconds: 1), vsync: this);

  //使用自定义曲线动画过渡效果
  late Animation<Offset> _animation1 = tween1.animate(
    CurvedAnimation(
      parent: _controller,
      curve: Curves.easeInOut,
    ),
  );
  late Animation<Offset> _animation2 = tween2.animate(CurvedAnimation(
    parent: _controller,
    curve: Curves.easeInOut,
  ));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SlideTransition'),
        brightness: Brightness.dark,
        backgroundColor: Colors.black,
      ),
      backgroundColor: Colors.black,
      body: Center(
        child: Container(
          padding: EdgeInsets.all(10.0),
          child: Stack(
            children: [
              SlideTransition(
                child: ClipOval(
                  child: Image.asset('images/beauty.jpeg'),
                ),
                position: _animation1,
              ),
              SlideTransition(
                child: ClipOval(
                  child: Image.asset('images/beauty2.jpeg'),
                ),
                position: _animation2,
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.swap_horizontal_circle_sharp),
        onPressed: () {
          setState(() {
            if (_forward) {
              _controller.forward();
            } else {
              _controller.reverse();
            }
            _forward = !_forward;
          });
        },
      ),
    );
  }
}

总结

本篇介绍了 SlideTransition 转换动画类及其应用。通过 SlideTransition 我们还可以实现很多其他动画效果,例如图片浏览、滑动卡片等。

到此这篇关于Android Flutter实现图片滑动切换效果的文章就介绍到这了,更多相关Flutter图片滑动切换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Java/Android 相关文章推荐
浅谈什么是SpringBoot异常处理自动配置的原理
Jun 21 Java/Android
详解java如何集成swagger组件
Jun 21 Java/Android
分析设计模式之模板方法Java实现
Jun 23 Java/Android
分析Java中Map的遍历性能问题
Jun 26 Java/Android
Spring Boot 实现敏感词及特殊字符过滤处理
Jun 29 Java/Android
Java中多线程下载图片并压缩能提高效率吗
Jul 01 Java/Android
Java 实战项目之家居购物商城系统详解流程
Nov 11 Java/Android
Java基础——Map集合
Apr 01 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
Springboot中如何自动转JSON输出
Jun 16 Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 Java/Android
基于Android10渲染Surface的创建过程
Aug 14 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Java 深入探究讲解简单工厂模式
springboot用户数据修改的详细实现
Apr 06 #Java/Android
Java中API的使用方法详情
Java 获取Word中所有的插入和删除修订的方法
springboot应用服务启动事件的监听实现
Apr 06 #Java/Android
Java十分钟精通进阶适配器模式
You might like
session在PHP大型web应用中的使用
2011/06/25 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
使用Filter过滤python中的日志输出的实现方法
2019/07/17 Python
Python爬取破解无线网络wifi密码过程解析
2019/09/17 Python
详解Django CAS 解决方案
2019/10/30 Python
python dict如何定义
2020/09/02 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
党课知识竞赛主持词
2014/04/01 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
《搭石》教学反思
2016/02/18 职场文书
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers