一、预览

参考:Flutter 133: 图解自定义 ACEWaterButton 水波纹按钮

二、分析

  • 内置圆为固定宽高矩形
  • 使用AnimationController获取时间进度
  • 外置圆为Paint绘制的动态宽高矩形,根据时间进度逐步更新透明度
  • Stack叠加内置矩形和外置矩形

1 内置矩形

Container(height: widget.innerHigh,width: widget.innerWidth,decoration: BoxDecoration(color: Colors.red,borderRadius: BorderRadius.circular(20.0))
)

2 水波纹

(1) 动画

当创建一个AnimationController时,需要传递一个vsync参数,它接收一个TickerProvider类型的对象,它的职责是创建Ticker。通常我们会讲SingleTickerProvideStateMixin添加到State的定义中,然后将State对象作为vsync的值。

片段如下:

class _ACEWaterButtonState extends State<ACEWaterButton>with SingleTickerProviderStateMixin {late AnimationController _controller;@overridevoid initState() {_controller = AnimationController(vsync: this, duration: widget.duration ?? Duration(milliseconds: 2000))..repeat();super.initState();}@overridevoid dispose() {_controller.dispose();super.dispose();}...

(2) 画水波纹矩形

class ACEWaterPainter extends CustomPainter {final double progress;final Color color;final double innerWidth;final double innerHigh;final double outerWidth;final double outerHigh;Paint _paint = Paint()..style = PaintingStyle.fill;ACEWaterPainter(this.progress, this.color, this.innerWidth, this.innerHigh, this.outerWidth, this.outerHigh);@overridevoid paint(Canvas canvas, Size size) {_paint..color = color.withOpacity(1.0 - progress);double _changeW = innerWidth + (outerWidth - innerWidth) * progress;double _changeH = innerHigh + (outerHigh - innerHigh) * progress;canvas.translate(size.width/2, size.height/2);canvas.drawRRect(RRect.fromRectAndRadius(Rect.fromCenter(center: Offset(0, 0), width: _changeW, height: _changeH), Radius.circular(20.0)), _paint);}@overridebool shouldRepaint(CustomPainter oldDelegate) => true;
}

三、完整代码

目前支持自定义如下参数

外置矩形宽高(可选,默认内置矩形2倍)

内置矩形宽高

颜色

单次时长(可选,默认2s)

import 'package:flutter/material.dart';class ACEWaterButton extends StatefulWidget {final double innerWidth;final double innerHigh;final double? outerWidth;final double? outerHigh;final Color color;final Duration? duration;const ACEWaterButton(this.color,{this.innerWidth = 68.0, this.innerHigh = 48.0, this.duration, this.outerWidth, this.outerHigh});@override_ACEWaterButtonState createState() => _ACEWaterButtonState();
}class _ACEWaterButtonState extends State<ACEWaterButton>with SingleTickerProviderStateMixin {late AnimationController _controller;@overridevoid initState() {_controller = AnimationController(vsync: this, duration: widget.duration ?? Duration(milliseconds: 2000))..repeat();super.initState();}@overridevoid dispose() {_controller.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return AnimatedBuilder(animation: _controller,builder: (context, child) {return Stack(alignment: Alignment.center,children: [CustomPaint(size: Size(widget.outerWidth ?? widget.innerWidth * 2, widget.outerHigh ?? widget.innerHigh * 2),painter: ACEWaterPainter(_controller.value, widget.color,widget.innerWidth, widget.innerHigh, widget.outerWidth ?? widget.innerWidth * 2, widget.outerHigh ?? widget.innerHigh * 2)),Container(height: widget.innerHigh,width: widget.innerWidth,decoration: BoxDecoration(color: widget.color,borderRadius: BorderRadius.circular(20.0)),),],);});}
}class ACEWaterPainter extends CustomPainter {final double progress;final Color color;final double innerWidth;final double innerHigh;final double outerWidth;final double outerHigh;Paint _paint = Paint()..style = PaintingStyle.fill;ACEWaterPainter(this.progress, this.color, this.innerWidth, this.innerHigh, this.outerWidth, this.outerHigh);@overridevoid paint(Canvas canvas, Size size) {_paint..color = color.withOpacity(1.0 - progress);double _changeW = innerWidth + (outerWidth - innerWidth) * progress;double _changeH = innerHigh + (outerHigh - innerHigh) * progress;canvas.translate(size.width/2, size.height/2);canvas.drawRRect(RRect.fromRectAndRadius(Rect.fromCenter(center: Offset(0, 0), width: _changeW, height: _changeH), Radius.circular(20.0)), _paint);}@overridebool shouldRepaint(CustomPainter oldDelegate) => true;
}

Flutter水波纹效果相关推荐

  1. Flutter 水波纹动画效果实现

    Flutter 水波纹动画效果实现 1. 先上效果图: 2. 实现 2.1 尺寸渐变结合透明度渐变 2.2 多个基本动画效果叠加 3. 总结 1. 先上效果图: 2. 实现 我们将该动画拆成三部分来实 ...

  2. Flutter InkWell 和 Ink --按钮“水波纹”效果

    InkWell InkWell组件在用户点击时出现"水波纹"效果,InkWell简单用法: InkWell(onTap: (){},child: Text('这是InkWell点击 ...

  3. Flutter 点击水波纹 效果

    FlatButton 原本已经包含了 点击水波纹 效果 不过目前已经弃用,由TextButton 代替,但 TextButton 的效果感觉没有 FlatButton 的好,另外 MaterialBu ...

  4. android自定义水波纹,Android自定义View——实现水波纹效果类似剩余流量球(示例代码)...

    最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧: 效果图镇楼 一:先一步一步来分解一下实现的过程 需要绘制一个正弦曲线(sin)或者余弦曲线(c ...

  5. 水波纹效果,附工程源码

    2019独角兽企业重金招聘Python工程师标准>>> 实现的一个水波纹效果,附工程代码. 这个可以用任意图片响应触屏事件显示波纹效果. 很多方面都能用得上,比如动态桌面,游戏,水族 ...

  6. html按钮按下效果_【CSS小分享】纯CSS实现一个水波纹效果按钮

    前言 如果大家有用过Material Design风格的UI库,那么一定对水波纹按钮很熟悉,我们这次就是使用纯CSS实现一个最简单的水波纹效果按钮,先上成品: 原理 在按钮中放置一个默认隐藏径向渐变的 ...

  7. html5 水波式按钮_css3+jQuery实现按钮水波纹效果

    水波纹按钮 /*自定义按钮样式*/ .btns{ height: 30px; line-height: 30px; text-align: center; width: 200px; color: # ...

  8. OpenGL水波纹效果

    OpenGL水波纹效果 glsl水波纹效果,可使用shadertoy直接运行.sin和iTime配合得到水波纹mask,通过mask流动变化得到水波纹效果. 脚本1 #iChannel0 " ...

  9. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球

    Android自定义View--实现水波纹效果类似剩余流量球 三个点   pre   ber   block   span   初始化   move   理解最近突然手痒就想搞个贝塞尔曲线做个水波纹效 ...

  10. Android 之自定义view实现水波纹效果

    在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她: 在这样的关键时候,身子板就一定得硬了, ...

最新文章

  1. python3 入门 (四) 类与继承
  2. iospython开发工具_使用Python开发iOS程序
  3. 编写一个函数itob(int n,char s[], int b),将整数n转换为以b进制的数。保存到s中。...
  4. 爬虫之proxy(代理)
  5. hbase 查询固定条数_HBase原理深入
  6. linux虚拟机tomcat上部署web项目的常用命令
  7. Linux 管理登陆的用户/查看/剔除
  8. 如何关闭mac烦人的更新升级提醒
  9. 正版phpStorm2019激活,phpStorm图文教程(转)
  10. WordPress 常用快捷键列表
  11. 注意:ORACLE 11G ADG RAC 这个情况下并不能高可用
  12. python 提取最小外接矩形_python给人脸带上口罩(简单版)
  13. java集合类(三)About Iterator Vector(Stack)
  14. CSS技巧之数字美化为机械字体样式
  15. 软件系统的测试计划,软件系统测试计划-模板
  16. 推荐几款优秀的开源编程字体
  17. 坑爹的matlab除法
  18. java建行验签不成功_php无COM版建行支付返回验签记录
  19. java poi 水印_JAVA不使用POI给Word文档添加水印
  20. 防劫持工具,介绍几款浏览器劫持修复工具

热门文章

  1. mppdbLibra
  2. 【MATLAB】MATLAB中format命令的用法
  3. 【基于微信小程序的社区电商平台】需求分析心得——小豆芽
  4. 软工中级实训——实训总结报告
  5. win7 系统定时开关机
  6. 【老九学堂】【Java】Java环境之JDK配置
  7. 【数据挖掘算法竞赛】山东省-公积金贷款逾期预测TOP8 baseline523
  8. win2003桌面图标蓝底去除
  9. 回顾展望:杀毒软件的“前世今生”
  10. PIP安装wxpy报错