代码如下:

首先计算比例,通过高度与直径之比;

大于半径和小于半径两部分

ctx.beginPath();
            if(posY>radius){
                ctx.arc(radius,radius,radius,startangle,Math.PI-startangle);
            }else{
                ctx.arc(radius,radius,radius,-startangle,Math.PI+startangle);
            }
            ctx.setFillStyle('#01BA48')
            ctx.setStrokeStyle('#01BA48')
            ctx.fill();
            ctx.stroke()

先画一个圆弧不带波浪的实体部分,如下图:

然后再话一个空的和实体的部分圆弧行成波浪,用一个定时器控制这个空的和实体两个小部分左右移动,方向自己定义

如下图:

最后画好背景和文字部分就完成了这个整体波浪运动效果,整体效果如下:

<template>
<view>
<view style="margin-top: 200rpx;"><view ><canvas class="cir-view" canvas-id="myCanvas4"></canvas></view>
</view>
</view>
</template>
<script>
const app = getApp();
export default {data() {return {timer:null,};},onShow: async function () {this.drawQuadraticCurve4();},methods: {drawQuadraticCurve4() {var obj = this.obj;var startX = 150,itemWidth = 50,offset = 0,baseLine = 10,waveHeight = 20,direction = 1,waveDirection = -1,percent = 0.3,radius=91,offsetY=0.2,offsetrY= 0.3var posY = 2*radius * (1-percent); // 所在位置Y值var h= Math.abs(radius - posY); // 高var arrow = Math.sqrt(radius*radius - h*h);//半弦长console.log("arrow====>"+arrow);const ctx = uni.createCanvasContext('myCanvas4')var startX = radius - arrow;// d=200  80%   160  100   60 100// θ=2*acos(h/d)  弦对应角度var angle = 2*Math.acos(h/radius);console.log("angle====>"+angle);var startangle =  (Math.PI - angle)*0.5;console.log("startangle====>"+angle);var itemwidth = 2*arrow;var left = 0;setInterval(runcircle,100);function drawText() {ctx.globalCompositeOperation = 'source-over';var size = 34;ctx.font = '500 ' + size + 'px PingFang-SC-Medium, PingFang-SC';var txt = '+'+(percent.toFixed(2) * 100).toFixed(0) + '%';var fonty = radius + size / 2;var fontx = radius - size * 0.8;//字体颜色ctx.fillStyle = "rgba(8, 77, 25, 0.9)";ctx.textAlign = 'center';ctx.fillText(txt, radius + 5, radius)}function drawDescText() {ctx.globalCompositeOperation = 'source-over';var size = 13;ctx.font = '500 ' + size + 'px PingFang-SC-Medium, PingFang-SC';var txt = '+'+(percent.toFixed(2) * 100).toFixed(0) + '%';var fonty = radius + size / 2;var fontx = radius - size * 0.8;//字体颜色ctx.fillStyle = "#084D19";ctx.textAlign = 'center';ctx.fillText("本月成交率",radius + 5, radius + 24)}function runcircle(){ctx.beginPath();ctx.arc(radius,radius,radius,0,Math.PI*2);ctx.setFillStyle('#B3F0CB')ctx.setStrokeStyle('#B3F0CB')ctx.fill();ctx.stroke()ctx.beginPath();if(posY>radius){ctx.arc(radius,radius,radius,startangle,Math.PI-startangle);}else{ctx.arc(radius,radius,radius,-startangle,Math.PI+startangle);}ctx.setFillStyle('#01BA48')ctx.setStrokeStyle('#01BA48')ctx.fill();ctx.stroke()for(var i =0;i<6;i++){var posX = itemwidth*i + left;ctx.beginPath()ctx.moveTo(posX+offset+startX,posY+offsetY)ctx.quadraticCurveTo(posX +startX+arrow*0.5+offset,posY-waveHeight,posX +startX+arrow+offset, posY+offsetY);ctx.lineTo(posX+startX+offset, posY+offsetY)ctx.setFillStyle('#01BA48')ctx.setStrokeStyle('#01BA48')ctx.setLineWidth(0.01)ctx.fill()ctx.beginPath()ctx.moveTo(posX + radius+offset,posY-offsetrY)ctx.quadraticCurveTo(posX + arrow*1.5+offset,posY+waveHeight,posX+ (radius*2 - startX)+offset, posY-offsetrY);ctx.lineTo(posX + radius*2 - startX, posY-offsetrY)ctx.setFillStyle('#B3F0CB')ctx.setStrokeStyle('#B3F0CB')ctx.setLineWidth(0.01)ctx.fill()}// ctx.fillStyle="#ff00000";//         ctx.strokeStyle="#0000ff";//         ctx.lineWidth=3;//         ctx.rect(0,0,radius*2,radius*2);//         ctx.fill();//填充//         ctx.stroke();//绘制边框//         ctx.clearRect(50,50,150,150)//         ctx.clearRect()// ctx.beginPath();// ctx.moveTo(0,0)// ctx.lineTo(2*radius,0)// ctx.lineTo(2*radius,2*radius)// ctx.lineTo(0,2*radius)// ctx.setFillStyle('#F13737')// ctx.fill()ctx.beginPath();ctx.arc(radius,radius,radius,0,Math.PI*2);ctx.setFillStyle('transparent')ctx.setStrokeStyle('#FFFFFF')ctx.setLineWidth(15)ctx.fill();ctx.stroke()// ctx.beginPath();// ctx.arc(radius,radius,radius,0,Math.PI*2);// ctx.clip();drawText()drawDescText()ctx.draw()if (waveDirection == 1) {offset = offset + 1} else if (waveDirection == -1) {offset = offset - 1}if (offset >= 5*itemwidth) {offset = 0;}console.log("offset===>"+offset);}    }}
};
</script>
<style>
.cir-view{border-radius: 50%;width: 182px;height: 182px;background: #B3F0CB;
}
</style>

自定义画圆进度条,带波浪动态效果相关推荐

  1. 用Raphael在网页中画圆环进度条(简化版)

    上篇写了用Raphael画圆环进度条(http://boytnt.blog.51cto.com/966121/1074215),这一篇把它简化一下,只画一条比较粗的弧,优点是简单,缺点是不能做渐变色了 ...

  2. 基于canvas 2D实现微信小程序自定义组件-环形进度条

    基于canvas 2D实现微信小程序自定义组件-环形进度条 最近开发一个小程序项目博闻金榜答题小程序,需要使用到一个可以显示答题倒计时的组件,基于进度条实现,下面就主要介绍基于canvas2D实现一个 ...

  3. android 自定义音乐圆形进度条,Android自定义View实现音频播放圆形进度条

    本篇文章介绍自定义View配合属性动画来实现如下的效果 实现思路如下: 根据播放按钮的图片大小计算出圆形进度条的大小 根据音频的时间长度计算出圆形进度条绘制的弧度 通过Handler刷新界面来更新圆形 ...

  4. Android Paint应用之自定义View实现进度条控件

    在上一篇文章<Android神笔之Paint>学习了Paint的基本用法,但是具体的应用我们还没有实践过.从标题中可知,本文是带领读者使用Paint,自定义一个进度条控件. 上图就是本文要 ...

  5. 用Raphael在网页中画圆环进度条

    条状的进度条我们见得太多了,实现起来比较简单,它总是长方形的,在方形的区域里摆放就不太好看了.随着css3的出现,圆环状的进度条开始用得越来越多,不过由于IE6/7/8不支持css3,我们只能换其它方 ...

  6. 自定义绘制圆形进度条

    自定义圆形进度条 Android 圆形进度条控件 demo示例 1.定义 attrs.xml <?xml version="1.0" encoding="utf-8 ...

  7. Android 自定义斑马波纹进度条

    参考地址: GitHub - Ccapton/Android-ColorfulProgressBar: Android 自定义彩色ProgressBar,类似Bootstrap android绘图ca ...

  8. 微信小程序自定义封装环形进度条组件

    我们先看效果-选不了视频没办法了 说明:此组件对圆的宽度,进度条的宽度.颜色.旋转方向,还有进度条的值,还有两端是否要圆角都进行了动态化,无坑可放心用,参数解释在注释里,我就不写了 .效果图看到尾部的 ...

  9. Android自定义圆形下载进度条,Android自定义之圆形进度条

    先来看看效果图,有图才有真相: Usage Android Studio 使用Gradle构建 dependencies { compile 'com.github.ws.circleprogress ...

最新文章

  1. 机器学习笔记(十六)强化学习
  2. vsFTPD编译安装使用实用手册
  3. NoClassDefFoundError: org/apache/flink/streaming/api/datastream/DataStream一例解决
  4. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
  5. leetcode18. 四数之和
  6. 更新计算机上的windows模块安装程序_Win10中用DOS命令也可以完成windows更新,这个技巧还真不知道...
  7. Postgresql 截取字符串
  8. Oracle的体系结构
  9. poj 1273 最大流
  10. shell command 输入时的快捷键
  11. python自学网站-python自学网站
  12. notion知识库网站
  13. 计算机桌面出现家庭组,win7系统桌面突然多出一个家庭组图标的解决方法
  14. SUMO交通仿真-核心概念和基础知识速览
  15. python实现CAPM模型
  16. 恕我直言,在座的各位根本写不好Java!
  17. matlab中如何求分段函数的图像
  18. 2023年东北大学电气工程专硕考研上岸经验
  19. EMS是中国邮政提供的一种快递服务。
  20. AD19导出Gerber文件-嘉立创打板

热门文章

  1. python爬虫实战:猫眼电影我不是药神评论
  2. 全国计算机二级c语言怎么复习,全国计算机二级C语言知识点复习:基本知识
  3. 什么叫做形态学图像处理_形态学图像处理
  4. C# 请求外部服务的办法
  5. iOS 芝麻认证开发(跳转本地的支付宝进行认证开发)
  6. php用户中心ui,Layui用户中心模板
  7. poj 3009 Curling 2.0
  8. 若依移动端Ruoyi-App——开发总结
  9. 导出Fbx和obj的工具
  10. rog主板php,强劲的扩展能力 - 华硕ROG Zenith Extreme主板评测:地表最强X399 - 超能网...