iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >怎么用Android贝塞尔曲线绘制一个波浪球
  • 148
分享到

怎么用Android贝塞尔曲线绘制一个波浪球

2023-06-30 14:06:20 148人浏览 薄情痞子
摘要

本篇内容介绍了“怎么用Android贝塞尔曲线绘制一个波浪球”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果如下所示:先来总结下 Wave

本篇内容介绍了“怎么用Android贝塞尔曲线绘制一个波浪球”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

效果如下所示:

怎么用Android贝塞尔曲线绘制一个波浪球

先来总结下 WaveLoadingWidget 的特点,这样才能归纳出实现该效果所需要的步骤:

  • widget 的主体是一个不规则的半圆形,顶部曲线以类似于波浪的形式从左往右上下起伏运行

  • 波浪球可以自定义颜色,此处以 waveColor 命名

  • 波浪球的起伏线将嵌入的文本分为上下两种颜色,上半部分颜色以 backgroundColor 命名,下半部分颜色以 foregroundColor 命名,文本的整体颜色一直在根据波浪的运行而动态变化中

虽然文本的整体颜色是在不断变化的,但只要能够绘制出其中一帧的图形,其动态效果就能通过不断改变波浪曲线的位置参数来实现,所以这里先把该 widget 当成静态的,先实现其静态效果即可

将绘制步骤拆解为以下几步:

  • 绘制颜色为 backgroundColor 的文本,将其绘制在 canvas 的最底层

  • 根据 widget 的宽高信息构建一个不超出范围的最大圆形路径 circlePath

  • 以 circlePath 的水平中间线作为波浪的基准起伏线,在起伏线的上边和下边分别用贝塞尔曲线绘制一段连续的波浪 path,将 path 的首尾两端以矩形的方式连接在一起,构成 wavePath,wavePath 的底部会与 circlePath 的最底部相交

  • 取 circlePath 和 wavePath 的交集 combinePath,用 waveColor 填充, 此时就得到了半圆形的球形波浪了

  • 利用 canvas.clipPath(combinePath) 方法裁切画布,再绘制颜色为 foregroundColor 的文本,此时绘制的 foregroundColor 文本只会显示 combinePath 范围内的部分,也即只会显示下半部分,使得两次不同时间绘制的文本重叠在了一起,从而得到了有不同颜色范围的文本

  • 利用 AnimationController 不断改变 wavePath 的起始点的 X 坐标,同时重新刷新 UI,从而得到波浪不断从左往右起伏运行的动态效果

现在就来一步步实现以上的绘制步骤吧

一、绘制 backgroundColor 文本

Flutter 通过 CustomPainter 为开发者提供了自绘 UI 的入口,其内部的 void paint(Canvas canvas, Size size) 方法提供了画布 canvas 对象以及包含 widget 宽高信息的 size 对象

这里就来继承 CustomPainter 类,在 paint 方法中先来绘制颜色为 backgroundColor 的文本。flutter 的 canvas 对象没有提供直接 drawTextapi,所以其绘制文本的步骤相对原生的自定义 View 要稍微麻烦一点

class _WaveLoadingPainter extends CustomPainter {  final String text;  final double fontSize;  final double animatedValue;  final Color backgroundColor;  final Color foregroundColor;  final Color waveColor;  _WaveLoadingPainter({    required this.text,    required this.fontSize,    required this.animatedValue,    required this.backgroundColor,    required this.foregroundColor,    required this.waveColor,  });  @override  void paint(Canvas canvas, Size size) {    final side = min(size.width, size.height);    _drawText(canvas: canvas, side: side, color: backgroundColor);  }  void _drawText(      {required Canvas canvas, required double side, required Color color}) {    ParagraphBuilder paragraphBuilder = ParagraphBuilder(ParagraphStyle(      textAlign: TextAlign.center,      fontStyle: FontStyle.nORMal,      fontSize: fontSize,    ));    paragraphBuilder.pushStyle(ui.TextStyle(color: color));    paragraphBuilder.addText(text);    ParagraphConstraints pc = ParagraphConstraints(width: fontSize);    Paragraph paragraph = paragraphBuilder.build()..layout(pc);    canvas.drawParagraph(      paragraph,      Offset((side - paragraph.width) / 2.0, (side - paragraph.height) / 2.0),    );  }  @override  bool shouldRepaint(CustomPainter oldDelegate) {    return animatedValue != (oldDelegate as _WaveLoadingPainter).animatedValue;  }}

怎么用Android贝塞尔曲线绘制一个波浪球

二、构建 circlePath

取 widget 的宽度和高度的最小值作为圆的直径大小,以此构建出一个不超出 widget 范围的最大圆形路径 circlePath

  @override  void paint(Canvas canvas, Size size) {    final side = min(size.width, size.height);    _drawText(canvas: canvas, side: side, color: backgroundColor);    final circlePath = Path();    circlePath.addArc(Rect.fromLTWH(0, 0, side, side), 0, 2 * pi);  }

三、绘制波浪线

波浪的宽度和高度就根据一个固定的比例值来求值,以 circlePath 的中间分隔线作为水平线,在水平线的上下根据贝塞尔曲线绘制出连续的波浪线

  @override  void paint(Canvas canvas, Size size) {    final side = min(size.width, size.height);    _drawText(canvas: canvas, side: side, color: backgroundColor);    final circlePath = Path();    circlePath.addArc(Rect.fromLTWH(0, 0, side, side), 0, 2 * pi);    final waveWidth = side * 0.8;    final waveHeight = side / 6;    final wavePath = Path();    final radius = side / 2.0;    wavePath.moveTo(-waveWidth, radius);    for (double i = -waveWidth; i < side; i += waveWidth) {      wavePath.relativeQuadraticBezierTo(          waveWidth / 4, -waveHeight, waveWidth / 2, 0);      wavePath.relativeQuadraticBezierTo(          waveWidth / 4, waveHeight, waveWidth / 2, 0);    }    //为了方便读者理解,这里把 wavePath 绘制出来,实际上不需要    final paint = Paint()      ..isAntiAlias = true      ..style = PaintingStyle.fill      ..strokeWidth = 3      ..color = waveColor;    canvas.drawPath(wavePath, paint);  }

怎么用Android贝塞尔曲线绘制一个波浪球

此时绘制的曲线还处于非闭合状态,需要将 wavePath 的首尾两端连接起来,这样后面才可以和 circlePath 取交集

wavePath.relativeLineTo(0, radius);wavePath.lineTo(-waveWidth, side);wavePath.close();//为了方便读者理解,这里把 wavePath 绘制出来,实际上不需要final paint = Paint()  ..isAntiAlias = true  ..style = PaintingStyle.fill  ..strokeWidth = 3  ..color = waveColor;canvas.drawPath(wavePath, paint);

wavePath 闭合后,此时半圆的颜色就会铺满了

怎么用Android贝塞尔曲线绘制一个波浪球

四、取交集

取 circlePath 和 wavePath 的交集,就得到一个半圆形波浪球了

final paint = Paint()  ..isAntiAlias = true  ..style = PaintingStyle.fill  ..strokeWidth = 3  ..color = waveColor;final combinePath = Path.combine(PathOperation.intersect, circlePath, wavePath);canvas.drawPath(combinePath, paint);

怎么用Android贝塞尔曲线绘制一个波浪球

五、绘制 foregroundColor 文本

文本的颜色是分为上下两部分的,上半部分颜色为 backgroundColor,下半部分为 foregroundColor。在第一步的时候已经绘制了颜色为 backgroundColor 的文本了,foregroundColor 文本不需要显示上半部分,所以在绘制 foregroundColor 文本之前需要先把绘制区域限定在 combinePath 内,使得两次不同时间绘制的文本重叠在了一起,从而得到有不同颜色范围的文本

canvas.clipPath(combinePath);_drawText(canvas: canvas, side: side, color: foregroundColor);

怎么用Android贝塞尔曲线绘制一个波浪球

六、添加动画

现在已经绘制好静态时的效果了,可以考虑如何使 widget 动起来了

要实现动态效果也很简单,只要不断改变贝塞尔曲线的起始点坐标,使之不断从左往右移动,就可以营造出波浪从左往右前进的效果了。_WaveLoadingPainter 根据外部传入的动画值 animatedValue 来设置 wavePath 的起始坐标点即可,生成 animatedValue 的逻辑和其它绘制参数均由 _WaveLoadingState 来提供

class _WaveLoadingState extends State<WaveLoading>    with SingleTickerProviderStateMixin {  String get _text => widget.text;  double get _fontSize => widget.fontSize;  Color get _backgroundColor => widget.backgroundColor;  Color get _foregroundColor => widget.foregroundColor;  Color get _waveColor => widget.waveColor;  late AnimationController _controller;  late Animation<double> _animation;  @override  void initState() {    super.initState();    _controller = AnimationController(        duration: const Duration(milliseconds: 700), vsync: this);    _animation = Tween(      begin: 0.0,      end: 1.0,    ).animate(_controller)      ..addListener(() {        setState(() => {});      });    _controller.repeat();  }  @override  void dispose() {    _controller.dispose();    super.dispose();  }  @override  Widget build(BuildContext context) {    return RepaintBoundary(      child: CustomPaint(        painter: _WaveLoadingPainter(          text: _text,          fontSize: _fontSize,          animatedValue: _animation.value,          backgroundColor: _backgroundColor,          foregroundColor: _foregroundColor,          waveColor: _waveColor,        ),      ),    );  }}

_WaveLoadingPainter 根据 animatedValue 来设置 wavePath 的起始坐标点

wavePath.moveTo((animatedValue - 1) * waveWidth, radius);

七、使用

最后将 _WaveLoadingState 包裹到 StatefulWidget 中,在 StatefulWidget 中开放可以自定义配置的参数就可以了

class WaveLoading extends StatefulWidget {  final String text;  final double fontSize;  final Color backgroundColor;  final Color foregroundColor;  final Color waveColor;  WaveLoading({    Key? key,    required this.text,    required this.fontSize,    required this.backgroundColor,    required this.foregroundColor,    required this.waveColor,  }) : super(key: key) {    assert(text.isNotEmpty && fontSize > 0);  }  @override  State<StatefulWidget> createState() {    return _WaveLoadingState();  }}

使用方式:

SizedBox(width: 300,height: 300,child: WaveLoading(  text: "開",  fontSize: 210,  backgroundColor: Colors.lightBlue,  foregroundColor: Colors.white,  waveColor: Colors.lightBlue,)

“怎么用Android贝塞尔曲线绘制一个波浪球”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么用Android贝塞尔曲线绘制一个波浪球

本文链接: https://www.lsjlt.com/news/329601.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 贝塞尔曲线绘制一个波浪球
    目录前言一、绘制 backgroundColor 文本二、构建 circlePath三、绘制波浪线四、取交集五、绘制 foregroundColor 文本六、添加动画七、使用前言 当...
    99+
    2024-04-02
  • 怎么用Android贝塞尔曲线绘制一个波浪球
    本篇内容介绍了“怎么用Android贝塞尔曲线绘制一个波浪球”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果如下所示:先来总结下 Wave...
    99+
    2023-06-30
  • Android用Canvas绘制贝塞尔曲线
    用Canvas画贝塞尔曲线,要画贝塞尔曲线首先了解贝塞尔曲线: 由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大的差别。即使是一位精明的画师能轻松绘出各...
    99+
    2024-04-02
  • android实现贝塞尔曲线之波浪效果
    本文实例为大家分享了android实现贝塞尔曲线之波浪效果的具体代码,供大家参考,具体内容如下 1 前言 为了给我以前的博客填坑,这章讲解贝塞尔曲线的几个常用的应用: 1.波浪效果2...
    99+
    2024-04-02
  • 怎么用android实现贝塞尔曲线之波浪效果
    这篇文章主要介绍“怎么用android实现贝塞尔曲线之波浪效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用android实现贝塞尔曲线之波浪效果”文章能帮助大家解决问题。1 前言贝塞尔曲线的...
    99+
    2023-07-02
  • Android怎么用Canvas绘制贝塞尔曲线
    这篇文章主要介绍了Android怎么用Canvas绘制贝塞尔曲线的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么用Canvas绘制贝塞尔曲线文章都会有所收获,下面我们一起来看看吧。用Canvas...
    99+
    2023-07-02
  • Android怎么利用贝塞尔曲线绘制动画
    本篇内容主要讲解“Android怎么利用贝塞尔曲线绘制动画”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么利用贝塞尔曲线绘制动画”吧!彩虹系列通过动画控制绘制的结束点,就可以让贝...
    99+
    2023-06-30
  • Android怎么自定义View绘制贝塞尔曲线
    本文小编为大家详细介绍“Android怎么自定义View绘制贝塞尔曲线”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android怎么自定义View绘制贝塞尔曲线”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在...
    99+
    2023-07-02
  • 如何使用canvas绘制贝塞尔曲线
    今天就跟大家聊聊有关如何使用canvas绘制贝塞尔曲线,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、二次贝塞尔曲线  quadraticCurv...
    99+
    2024-04-02
  • Android自定义View绘制贝塞尔曲线的方法
    本文实例为大家分享了Android自定义View绘制贝塞尔曲线的具体代码,供大家参考,具体内容如下 在平面内任选 3 个不共线的点,依次用线段连接。 在第一条线段上任选一个点 D。计...
    99+
    2024-04-02
  • 怎么用html5的canvas画布绘制贝塞尔曲线
    这篇文章主要介绍“怎么用html5的canvas画布绘制贝塞尔曲线”,在日常操作中,相信很多人在怎么用html5的canvas画布绘制贝塞尔曲线问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • 怎么在Android应用中实现一个贝塞尔曲线
    这篇文章给大家介绍怎么在Android应用中实现一个贝塞尔曲线,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。贝塞尔曲线有一阶、二阶、三阶、N阶 一阶就是一条直线,有起点终点,没有控制点,对应方法就是canvas.dra...
    99+
    2023-05-31
    android 贝塞尔曲线 roi
  • Android通过交互实现贝塞尔曲线的绘制
    目录前言获取触控位置交互绘制实现绘制代码运行效果总结前言 之前几篇我们介绍了贝塞尔曲线的原理、绘制曲线和动效实现,这些都是代码预设好的,如果我们要根据需要自行绘制曲线,就需要使用交互...
    99+
    2024-04-02
  • Android自定义View绘制贝塞尔曲线实现流程
    目录前言二阶贝塞尔曲线三阶贝塞尔曲线前言 对于Android开发,实现贝塞尔曲线还是比较方便的,有对应的API供你调用。由于一阶贝塞尔曲线就是一条直线,实际没啥多大用处,因此,下面主...
    99+
    2022-11-13
    Android 贝塞尔曲线 Android 贝塞尔曲线实现方法
  • Android利用贝塞尔曲线绘制动画的示例代码
    目录彩虹系列弹簧动画复杂立体感动画总结前面我们花了几篇介绍了贝塞尔曲线的原理和绘制贝塞尔曲线,着实让我们见识到了贝塞尔曲线的美。好奇心驱使我想看看贝塞尔曲线动起来会是什么样?本篇就借...
    99+
    2024-04-02
  • Android怎么自定义view贝塞尔曲线
    这篇文章主要介绍了Android怎么自定义view贝塞尔曲线的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么自定义view贝塞尔曲线文章都会有所收获,下面我们一起来看看吧。贝塞尔曲线以一个简单的...
    99+
    2023-07-02
  • 如何用html5的canvas画布绘制贝塞尔曲线
    这篇“如何用html5的canvas画布绘制贝塞尔曲线”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2024-04-02
  • AndroidFlutter利用贝塞尔曲线画一个小海豚
    目录前言效果图实现步骤总结前言 贝塞尔曲线的应用填补了计算机绘制与手绘之前的差距,更能表达人想画出的曲线,为了更好的理解万能的贝塞尔曲线,而海豚是我认为在海洋生物中身体曲线最完美的海...
    99+
    2024-04-02
  • 使用Canvas怎么绘制一个贝赛尔曲线轨迹动画
    本篇文章为大家展示了使用Canvas怎么绘制一个贝赛尔曲线轨迹动画,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。二次贝赛尔曲线   function draw...
    99+
    2023-06-09
  • Android自定义View绘制贝塞尔曲线中小红点的方法
    目录前言需求效果图代码主要问题简单画法使用贝塞尔曲线前言 上一篇文章用扇形图练习了一下安卓的多点触控,实现了单指旋转、二指放大、三指移动,四指以上同时按下进行复位的功能。今天这篇文章...
    99+
    2023-02-09
    Android绘制贝塞尔曲线 Android贝塞尔曲线小红点
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作