1. import 'package:flutter/material.dart';
  2. void main() => runApp(MyApp());
  3. class MyApp extends StatelessWidget {
  4. @override
  5. Widget build(BuildContext context) {
  6. return MaterialApp(
  7. home: HomePage(),
  8. );
  9. }
  10. }
  11. class HomePage extends StatefulWidget {
  12. @override
  13. _HomePageState createState() => _HomePageState();
  14. }
  15. class _HomePageState extends State<HomePage>
  16. with SingleTickerProviderStateMixin {
  17. AnimationController controller;
  18. @override
  19. void initState() {
  20. super.initState();
  21. controller = AnimationController(
  22. duration: Duration(seconds: 1),
  23. vsync: this,
  24. );
  25. }
  26. @override
  27. Widget build(BuildContext context) {
  28. return Scaffold(
  29. backgroundColor: Colors.grey,
  30. appBar: AppBar(
  31. title: Text('Home Page'),
  32. ),
  33. body: Center(
  34. child: AnimatedArrowIcon(
  35. controller: controller,
  36. color: Colors.white,
  37. size: Size(600, 600),
  38. iconSize: 30,
  39. onDoubleTap: () {
  40. controller.forward();
  41. },
  42. ),
  43. ),
  44. );
  45. }
  46. }
  47. class AnimatedArrowIcon extends StatefulWidget {
  48. final AnimationController controller;
  49. final Color color;
  50. final Function onTap;
  51. final Function onDoubleTap;
  52. final Size size;
  53. final double iconSize;
  54. final Animation<double> _oneIconOpacityAnimation;
  55. final Animation<double> _twoIconOpacityAnimation;
  56. final Animation<double> _threeIconOpacityAnimation;
  57. final Animation<Size> _sizeAnimation;
  58. static final double _begin = 0.0;
  59. static final double _end = 2.0;
  60. static final Curve _curve = Curves.easeInOut;
  61. AnimatedArrowIcon({
  62. Key key,
  63. @required this.controller,
  64. this.color = Colors.black,
  65. this.onTap,
  66. this.onDoubleTap,
  67. this.size = const Size(300, 300),
  68. this.iconSize = 24.0,
  69. }) : _oneIconOpacityAnimation =
  70. Tween<double>(begin: _begin, end: _end).animate(
  71. CurvedAnimation(
  72. parent: controller,
  73. curve: Interval(0.0, 0.7, curve: _curve),
  74. ),
  75. ),
  76. _twoIconOpacityAnimation =
  77. Tween<double>(begin: _begin, end: _end).animate(
  78. CurvedAnimation(
  79. parent: controller,
  80. curve: Interval(0.2, 0.8, curve: _curve),
  81. ),
  82. ),
  83. _threeIconOpacityAnimation =
  84. Tween<double>(begin: _begin, end: _end).animate(
  85. CurvedAnimation(
  86. parent: controller,
  87. curve: Interval(0.5, 1.0, curve: _curve),
  88. ),
  89. ),
  90. _sizeAnimation = Tween<Size>(begin: Size(0, 0), end: size).animate(
  91. CurvedAnimation(
  92. parent: controller,
  93. curve: Interval(0.0, 0.8, curve: _curve),
  94. ),
  95. ),
  96. super(key: key);
  97. @override
  98. _AnimatedArrowIconState createState() => _AnimatedArrowIconState();
  99. }
  100. class _AnimatedArrowIconState extends State<AnimatedArrowIcon> {
  101. double get _oneValue => _edge(_lerp(widget._oneIconOpacityAnimation.value));
  102. double get _twoValue => _edge(_lerp(widget._twoIconOpacityAnimation.value));
  103. double get _threeValue =>
  104. _edge(_lerp(widget._threeIconOpacityAnimation.value));
  105. double _edge(double v) => v > 1.0 ? 1.0 : v < 0 ? 0 : v;
  106. double _lerp(double v) => v >= 1 ? (v - AnimatedArrowIcon._end).abs() : v;
  107. double _opacity = 0;
  108. @override
  109. void initState() {
  110. super.initState();
  111. widget.controller.addStatusListener((status) {
  112. if (status == AnimationStatus.completed) {
  113. setState(() => _opacity = 0);
  114. widget.controller.reset();
  115. }
  116. if (status == AnimationStatus.forward) {
  117. setState(() => _opacity = 1);
  118. }
  119. });
  120. }
  121. @override
  122. Widget build(BuildContext context) {
  123. return GestureDetector(
  124. onTap: widget.onTap,
  125. onDoubleTap: widget.onDoubleTap,
  126. child: AnimatedBuilder(
  127. animation: widget.controller,
  128. builder: (context, child) {
  129. return Stack(
  130. alignment: Alignment.center,
  131. children: [
  132. AnimatedOpacity(
  133. opacity: _opacity,
  134. duration: widget.controller.duration,
  135. curve: Curves.easeOutQuint,
  136. child: Container(
  137. width: widget.size.width,
  138. height: widget.size.width,
  139. decoration: BoxDecoration(
  140. shape: BoxShape.circle,
  141. color: Colors.white.withOpacity(0.1),
  142. ),
  143. ),
  144. ),
  145. Container(
  146. width: widget._sizeAnimation.value.width,
  147. height: widget._sizeAnimation.value.height,
  148. decoration: BoxDecoration(
  149. shape: BoxShape.circle,
  150. color: Colors.white.withOpacity(0.1),
  151. ),
  152. ),
  153. SizedBox(
  154. width: widget.iconSize * 3.0,
  155. child: Stack(
  156. alignment: Alignment.center,
  157. children: [
  158. Align(
  159. alignment: Alignment(-0.6, 0),
  160. child: Opacity(
  161. opacity: _oneValue,
  162. child: child,
  163. ),
  164. ),
  165. Opacity(
  166. opacity: _twoValue,
  167. child: child,
  168. ),
  169. Align(
  170. alignment: Alignment(0.6, 0),
  171. child: Opacity(
  172. opacity: _threeValue,
  173. child: child,
  174. ),
  175. ),
  176. ],
  177. ),
  178. ),
  179. ],
  180. );
  181. },
  182. child: Icon(
  183. Icons.play_arrow,
  184. color: widget.color,
  185. size: widget.iconSize,
  186. ),
  187. ),
  188. );
  189. }
  190. }

Flutter 模拟youtube快进icon的更多相关文章

  1. MediaElement视频控制:播放、暂停、停止、后退、快进、跳转、音量

    /* =================================================  * Author:     Micro  * Date:       2016=03-25 ...

  2. jwplayer 禁止视频的快进,但是可以后退(已实现)

    一直在研究.net 的视频播放,最近做起了jwplayer,然后项目要求是视频不能快进,但是可以重复观看已经看过的视频资源. 很简单 在标签<script> 中定义两个变量 var max ...

  3. video字幕无法显示,video视频在google中无法控制快进

    video字幕(track)无法显示: 直接用关闭同源策略的浏览器打开你的HTML文件可以请求到字幕文件并显示字幕: 从hbuilder中打开html文件,在从里面打开google浏览器去浏览HTML ...

  4. 关于jwplayer 处理进度条禁止快进的处理方法。

    今天在处理一个关于jwplayer  第一次播放禁止快进,但是可以后退的一个需求.开始在网上去查一些方法,有几个方法是换皮肤,禁止点击,但是和我的初衷不是很一致,还有一种方式是官网查看了API接口的方 ...

  5. Video/Audio禁止快进(退)

    首先接着上个随笔.上个随笔主要介绍了视频音频的相关操作.属性和方法.这里主要记录一个应用:禁止快进(快退同理). 思路:监听快进事件(此处是监听播放时间更新),利用一个缓存的时间和播放到的时间进行对比 ...

  6. html5 vedio 播放器,禁掉进度条快进快退事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 修改CKplayer.js 源码解决移动端浏览器全屏不能限制快进的问题

    原文地址:https://www.cnblogs.com/jying/p/9642445.html,转载请说明出处. 最近项目需要播放视频且限制未观看部分的快进功能,找了两款js插件ckplayer和 ...

  8. android开发之GestureDetector手势识别(调节音量、亮度、快进和后退)

    写UI布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro ...

  9. Eclipse之向前快进,向后快退

    在已经写好的代码上进行修改,存在代码快需要向前快进,向后快退的情况. 选中代码块,然后右击,有Shift Right, Shift Left

随机推荐

  1. 省选复习 - LCT 笔记

    目录 LCT 笔记 主要功能 和其它数据结构的比较 思想 虚实剖分 如何维护所有的链 实链 虚边 开始构思 具体要维护的功能(从基础到高级) Splay部分 access(u) make(u) fin ...

  2. Oracle数据库误删除数据恢复(Oracle闪回功能)

    一.启用行移动功能 alter table table_name enable row movement ; 二.可查询之前某一个时间点的数据(默认是1440分钟,即24小时内的数据) select ...

  3. ESRI,空间数据处理,WKT,GeoJson

    ESRI,空间数据处理,WKT,GeoJson 一.WKT 二.GeoJson 三.WKT转GeoJson 四.GeoJson 转 WKT 一.WKT WKT(well-known text)是一种文 ...

  4. SpringMvc获取getbean

    import org.apache.commons.lang3.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; i ...

  5. vulnhub靶机练习-Os-hackNos-1,超详细使用

    第一次写自己总结的文章,之后也会有更新,目前还在初学阶段. 首先介绍一下靶机,靶机是 vulnhub Os-hackNos-1 简介: 难度容易到中, flag 两个 一个是普通用户的user.txt ...

  6. Java程序操作Hive

    1.hive的lib+jdbc,还要把mysql的连接驱动加载过来 2.编写程序 开启远程服务:[root@zhiyou ~]# hiveserver2 &[1] 4127[root@zhiy ...

  7. 2019 ICPC 上海区域赛总结

    2019上海区域赛现场赛总结 补题情况(以下通过率为牛客提交): 题号 标题 已通过代码 通过率 我的状态 A Mr. Panda and Dominoes 点击查看 5/29 未通过 B Prefi ...

  8. 简谈图论重要性&&图论总结

    从外地学习回来,我对图论才有认识(以前就没接触过,非常尴尬),说实话,学好图论的重要性,就像学数学时在进行解析几何时,图极有可能是打开答案的最后秘钥,也就是数形结合,而懂的人永远明白,用图解决绝对比用 ...

  9. poj 3304 Segments(解题报告)

    收获:举一反三:刷一道会一道 1:思路转化:(看的kuangbin的思路) 首先是在二维平面中:如果有很多线段能够映射到这个直线上并且至少重合于一点,充要条件: 是过这个点的此条直线的垂线与其他所有直 ...

  10. c语言实现--不带头结点的单链表操作

    1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链 ...