经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Flutter » 查看文章
Android Flutter实现图片滑动切换效果
来源:jb51  时间:2022/4/7 10:49:31  对本文有异议

前言

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

SlideTransition 介绍

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

  1. const?SlideTransition({
  2. ??Key??key,
  3. ??required?Animation<Offset>?position,
  4. ??this.transformHitTests?=?true,
  5. ??this.textDirection,
  6. ??this.child,
  7. })

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

  1. new_x?=?width?*?dx;
  2. new_y?=?height?*?dy;

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

示例效果实现

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

  1. class?SlideTransitionDemo?extends?StatefulWidget?{
  2. ??SlideTransitionDemo({Key??key})?:?super(key:?key);
  3.  
  4. ??@override
  5. ??_SlideTransitionDemoState?createState()?=>?_SlideTransitionDemoState();
  6. }
  7.  
  8. class?_SlideTransitionDemoState?extends?State<SlideTransitionDemo>
  9. ????with?SingleTickerProviderStateMixin?{
  10. ??bool?_forward?=?true;
  11. ??final?begin?=?Offset.zero;
  12. ??//?第一张图片结束位置移出右侧屏幕
  13. ??final?end1?=?Offset(1.1,?0.0);
  14. ??//?第二张图片的初始位置在左侧屏幕
  15. ??final?begin2?=?Offset(-1.1,?0.0);
  16. ??late?Tween<Offset>?tween1?=?Tween(begin:?begin,?end:?end1);
  17. ??late?Tween<Offset>?tween2?=?Tween(begin:?begin2,?end:?begin);
  18.  
  19. ??late?AnimationController?_controller?=
  20. ??????AnimationController(duration:?const?Duration(seconds:?1),?vsync:?this);
  21.  
  22. ??//使用自定义曲线动画过渡效果
  23. ??late?Animation<Offset>?_animation1?=?tween1.animate(
  24. ????CurvedAnimation(
  25. ??????parent:?_controller,
  26. ??????curve:?Curves.easeInOut,
  27. ????),
  28. ??);
  29. ??late?Animation<Offset>?_animation2?=?tween2.animate(CurvedAnimation(
  30. ????parent:?_controller,
  31. ????curve:?Curves.easeInOut,
  32. ??));
  33.  
  34. ??@override
  35. ??Widget?build(BuildContext?context)?{
  36. ????return?Scaffold(
  37. ??????appBar:?AppBar(
  38. ????????title:?Text('SlideTransition'),
  39. ????????brightness:?Brightness.dark,
  40. ????????backgroundColor:?Colors.black,
  41. ??????),
  42. ??????backgroundColor:?Colors.black,
  43. ??????body:?Center(
  44. ????????child:?Container(
  45. ??????????padding:?EdgeInsets.all(10.0),
  46. ??????????child:?Stack(
  47. ????????????children:?[
  48. ??????????????SlideTransition(
  49. ????????????????child:?ClipOval(
  50. ??????????????????child:?Image.asset('images/beauty.jpeg'),
  51. ????????????????),
  52. ????????????????position:?_animation1,
  53. ??????????????),
  54. ??????????????SlideTransition(
  55. ????????????????child:?ClipOval(
  56. ??????????????????child:?Image.asset('images/beauty2.jpeg'),
  57. ????????????????),
  58. ????????????????position:?_animation2,
  59. ??????????????),
  60. ????????????],
  61. ??????????),
  62. ????????),
  63. ??????),
  64. ??????floatingActionButton:?FloatingActionButton(
  65. ????????child:?Icon(Icons.swap_horizontal_circle_sharp),
  66. ????????onPressed:?()?{
  67. ??????????setState(()?{
  68. ????????????if?(_forward)?{
  69. ??????????????_controller.forward();
  70. ????????????}?else?{
  71. ??????????????_controller.reverse();
  72. ????????????}
  73. ????????????_forward?=?!_forward;
  74. ??????????});
  75. ????????},
  76. ??????),
  77. ????);
  78. ??}
  79. }

总结

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号