android 动态水球,Canvas 制作动态进度加载水球详解及实例代码

Canvas 动态进度加载水球

前言

之前看到一些球型的动态加载的效果,一直想自己动手做一个,正好这段时间重温了一个Canvas,所以就尝试了一下。

2b1fcdf52c63f79bbd5e3ef27ac34f3d.gif

实现思路

关于水波的实现,使用了sin()函数,通过每一帧不断的移动sin()函数曲线,实现水波动态效果。然后,通过绘制圆形路径,进行clip(),实现球型效果。

sin()函数相关

这里说一下sin()函数的相关基础,对于绘制水波的影响。

看一下图,回顾一下中学sin()函数的基础。

4f836f984b596d990fd8549e363729c0.png

从图中可以看出,当函数为sin(x)时,值域为[-1, 1],周期为2π。

当sin(x)乘以一个数,可以改变值域,也就是峰值,如下图:

62026f981052efb96a658a62914026dc.png

系数大于1时曲线更陡峭,小于1大于0时曲线更缓。

44761770f7747184e6fbbcbfb746a7a7.png

当sin(x ± 某个数)时,实现曲线的左右移动,减时右移,加时左移。

1cf1925927978d608241bbfe8aa557b2.png

当sin(x * 某个数)时,曲线的周期会变化,某个数大于1时,周期变短;某个数小于1大于0时,周期变长。

在一点,sin()是一个周期函数,所以只要不断的给它值,它就会周期变化。

8be02f2c140efb62611c3e8e1fbac3a5.png

好了,sin()的数学基础差不多了,接下来开始步入正题。

绘制 sin() 曲线

var canvas = document.getElementById('c');

var ctx = canvas.getContext('2d');

//画布属性

var mW = canvas.width = 700;

var mH = canvas.height = 300;

var lineWidth = 1;

//Sin 曲线属性

var sX = 0;

var sY = mH / 2;

var axisLength = mW; //轴长

var waveWidth = 0.011 ; //波浪宽度,数越小越宽

var waveHeight = 70; //波浪高度,数越大越高

ctx.lineWidth = lineWidth;

//画sin 曲线函数

var drawSin = function(xOffset){

ctx.save();

var points=[]; //用于存放绘制Sin曲线的点

ctx.beginPath();

//在整个轴长上取点

for(var x = sX; x < sX + axisLength; x += 20 / axisLength){

//此处坐标(x,y)的取点,依靠公式 “振幅高*sin(x*振幅宽 + 振幅偏移量)”

var y = -Math.sin((sX + x) * waveWidth);

points.push([x, sY + y * waveHeight]);

ctx.lineTo(x, sY + y * waveHeight);

}

//封闭路径

ctx.lineTo(axisLength, mH);

ctx.lineTo(sX, mH);

ctx.lineTo(points[0][0],points[0][1]);

ctx.stroke()

ctx.restore();

};

drawSin()

136269442e59bf5060e61f083f23adb5.png

此处通过waveWidth和waveHeight调节曲线的陡峭度和周期。

加入动态效果

var speed = 0.04; //波浪速度,数越大速度越快

var xOffset = 0; //波浪x偏移量

速度变量和x偏移变量

var y = -Math.sin((sX + x) * waveWidth + xOffset);

修改y点的函数。

var render = function(){

ctx.clearRect(0, 0, mW, mH);

drawSin(xOffset);

xOffset += speed; //形成动态效果

requestAnimationFrame(render);

}

render()

加入渲染。

63e4d13cdd6698d62b385d9dde929d42.gif

百分比控制

因为要加入百分比不同的涨幅效果,所以要对y的坐标时行百分比控制修改。

var dY = mH * (1 - nowRange / 100 );

球型显示

这里需要用到clip()进行球型裁切显示。

ctx.beginPath();

ctx.arc(r, r, cR, 0, 2 * Math.PI);

ctx.clip();

其他

可以通过修改如下变量来修改曲线的形状以及速度:

var waveWidth = 0.015 ; //波浪宽度,数越小越宽

var waveHeight = 6; //波浪高度,数越大越高

var speed = 0.09; //波浪速度,数越大速度越快

完整代码

Document

#c{

margin: 0 auto;

display: block;

}

#r{

display: block;

margin: 0 auto;

}

#r::before{

color: black;

content: attr(min);

padding-right: 10px;

}

#r::after{

color: black;

content: attr(max);

padding-left: 10px;

}

var canvas = document.getElementById('c');

var ctx = canvas.getContext('2d');

var range = document.getElementById('r');

//range控件信息

var rangeValue = range.value;

var nowRange = 0; //用于做一个临时的range

//画布属性

var mW = canvas.width = 250;

var mH = canvas.height = 250;

var lineWidth = 2;

//圆属性

var r = mH / 2; //圆心

var cR = r - 16 * lineWidth; //圆半径

//Sin 曲线属性

var sX = 0;

var sY = mH / 2;

var axisLength = mW; //轴长

var waveWidth = 0.015 ; //波浪宽度,数越小越宽

var waveHeight = 6; //波浪高度,数越大越高

var speed = 0.09; //波浪速度,数越大速度越快

var xOffset = 0; //波浪x偏移量

ctx.lineWidth = lineWidth;

//画圈函数

var IsdrawCircled = false;

var drawCircle = function(){

ctx.beginPath();

ctx.strokeStyle = '#1080d0';

ctx.arc(r, r, cR+5, 0, 2 * Math.PI);

ctx.stroke();

ctx.beginPath();

ctx.arc(r, r, cR, 0, 2 * Math.PI);

ctx.clip();

}

//画sin 曲线函数

var drawSin = function(xOffset){

ctx.save();

var points=[]; //用于存放绘制Sin曲线的点

ctx.beginPath();

//在整个轴长上取点

for(var x = sX; x < sX + axisLength; x += 20 / axisLength){

//此处坐标(x,y)的取点,依靠公式 “振幅高*sin(x*振幅宽 + 振幅偏移量)”

var y = -Math.sin((sX + x) * waveWidth + xOffset);

var dY = mH * (1 - nowRange / 100 );

points.push([x, dY + y * waveHeight]);

ctx.lineTo(x, dY + y * waveHeight);

}

//封闭路径

ctx.lineTo(axisLength, mH);

ctx.lineTo(sX, mH);

ctx.lineTo(points[0][0],points[0][1]);

ctx.fillStyle = '#1c86d1';

ctx.fill();

ctx.restore();

};

//写百分比文本函数

var drawText = function(){

ctx.save();

var size = 0.4*cR;

ctx.font = size + 'px Microsoft Yahei';

ctx.textAlign = 'center';

ctx.fillStyle = "rgba(06, 85, 128, 0.8)";

ctx.fillText(~~nowRange + '%', r, r + size / 2);

ctx.restore();

};

var render = function(){

ctx.clearRect(0, 0, mW, mH);

rangeValue = range.value;

if(IsdrawCircled == false){

drawCircle();

}

if(nowRange <= rangeValue){

var tmp = 1;

nowRange += tmp;

}

if(nowRange > rangeValue){

var tmp = 1;

nowRange -= tmp;

}

drawSin(xOffset);

drawText();

xOffset += speed;

requestAnimationFrame(render);

}

render();

效果

5916fbbb46959cf782788249c84c9564.gif

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352427.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CSS动态能量加载水球

效果如下&#xff1a; 相关代码&#xff1a; 由于水面上升的高度是动态传值控制&#xff0c;所以水面上升和波动的动画需通过js添加。 HTML&#xff1a; <div class"crystal"><div class"box"><div class"wave"></div&g…

自定义水球

效果图&#xff1a; 这里的水波纹效果实际上是用得到了数学里的正弦函数,关于正弦函数&#xff1a; 正弦型函数解析式&#xff1a;yAsin&#xff08;ωxφ&#xff09;h 各常数值对函数图像的影响&#xff1a; φ&#xff08;初相位&#xff09;&#xff1a;决定波形与X轴位置…

d3js 实现水球图

d3js 源码地址&#xff1a;: http://bl.ocks.org/brattonc/5e5ce9beee483220e2f6 官方提供的代码不能直接用&#xff0c;版本3.x 这是调整后v5能使用的。 <!DOCTYPE html> <html><head><meta charsetutf-8><meta http-equivX-UA-Compatible conte…

echarts 画动态水球

前言 在对一些需要存放液体的工厂进行开发基于物联网传感器的监控平台时&#xff0c;经常需要监控 该蓄水池当前所处的容量占比为多少。 以达到随时调整其蓄水量的目的。接下来我们看 一下一些常见的水球项目。 有这样的&#xff1a; 这样的&#xff1a; 甚至还有这样的&…

ECHARTS 水球图

转载编辑。 原作者链接地址&#xff1a;https://zhuanlan.zhihu.com/p/25353670?group_id827655855632715776 水球图是一种适合于展现单个百分比数据的图表类型&#xff0c;ECharts 的水球图插件使你能够通过非常简单的配置&#xff0c;实现酷炫的数据展示效果。 第一步&…

echarts 水球图

// ECharts 水球图插件&#xff0c;需要额外插件脚本&#xff0c;参见上方“脚本” // 完整配置参数参见&#xff1a;https://github.com/ecomfe/echarts-liquidfillvar option {series: [{type: liquidFill,data: [0.6, 0.5, 0.4, 0.3],radius: 40%,shape: diamond,center: […

从0到1:如何建立一个大规模多语言代码生成预训练模型

国产AI辅助编程工具CodeGeeX是一个使用AI大模型为基座的辅助编程工具&#xff0c;帮助开发人员更快的编写代码。可以自动完成整个函数的编写&#xff0c;只需要根据注释或Tab按键即可。它已经在Java、JavaScript和Python等二十多种语言上进行了训练&#xff0c;并基于大量公开的…

【Python】打包与发布(Packaging and distributing projects)

以Unix/macOS系统为例。 前提准备&#xff1a;确保pip为最新版本&#xff0c;可使用以下命令来更新pip&#xff1a; python3 -m pip install --upgrade pip一、创建一个简单的项目 我们在目录packaging_tutorial下进行操作。 项目名称为&#xff1a;example_package_wayne。 …

2023国际管理会计教育联盟发展论坛在沪成功召开

2023年5月7日&#xff0c;由教育部中外人文交流中心、国际管理会计教育联盟&#xff08;下称“联盟”&#xff09;主办&#xff0c;中国商业会计学会、上海交通大学安泰经济与管理学院承办的2023国际管理会计教育联盟发展论坛&#xff08;下称“发展论坛”&#xff09;在上海成…

系统架构师之高内聚低耦合

一、概念&#xff1a; 标记耦合&#xff08;Stamp Coupling&#xff09;和数据耦合&#xff08;Data Coupling&#xff09;是软件设计中两种不同的耦合类型&#xff0c;它们之间的区别如下&#xff1a; 标记耦合&#xff1a;标记耦合是指模块之间通过参数传递标记或标识符来进…

怎样把m4a转换成mp3格式?

怎样把m4a转换成mp3格式&#xff1f;大家都知道m4a音频格式兼容性差&#xff0c;这已成为许多小伙伴头疼的问题&#xff0c;因为很多人不会m4a转mp3的方法&#xff0c;从而导致m4a音频无法正常播放。在过去&#xff0c;想把m4a转换成mp3格式确实有一定的难度&#xff0c;但是如…

m4a怎么转换成mp3格式?

最近总有伙伴问我&#xff1a;“小编&#xff0c;m4a怎么转换成mp3格式&#xff1f;有没有什么简单有效的方法”。其实要想把m4a转换成mp3格式&#xff0c;转换工具就是钥匙&#xff0c;有了这把钥匙你就能更快地打开m4a转mp3格式的大门了。所以&#xff0c;选择好转换工具&…

如何快速的把m4a转换成mp3格式

无论是把m4a转换成mp3格式&#xff0c;还是把其他别的格式转换成mp3格式&#xff0c;一直都是有搜索热度的问题。虽然近两年把m4a转换成MP3的解决方法有很多&#xff0c;但是依旧满足不了小伙伴们寻找转换方法的现状。最主要的原因不是大家找不到转换成MP3的方法&#xff0c;而…

怎样把m4a转换mp3格式?

怎样把m4a转换mp3格式&#xff1f;m4a是苹果手机上的录音文件格式&#xff0c;随着苹果手机的广泛普及&#xff0c;m4a音频文件使用也越来越多&#xff0c;有的小伙伴将m4a音频文件转载到电脑上后&#xff0c;会因为兼容性的问题导致m4a文件不能打开播放。由于m4a是苹果公司开发…

m4r是什么文件格式?m4r怎么转成mp3?

你知道m4r是什么文件格式吗&#xff1f;如果你不知道是正常的&#xff0c;因为它真的太少见了&#xff0c;其实m4r是iPhone铃声的一种音频格式&#xff0c;简单的说m4就是音质音频文件的格式&#xff0c;并且实在iPhone手机上使用。如果你是安卓手机&#xff0c;是不能打开这种…

如何将录音m4a转换为mp3格式?

如何将录音m4a转换为mp3格式&#xff1f;前段时间由于工作原因&#xff0c;需要上传录音文件到一个网站上&#xff0c;可是这个录音文件怎么也上传不上去&#xff0c;查看原因后才发现原来网站只支持mp4的音频文件&#xff0c;而我是用苹果手机录音的&#xff0c;录音文件是m4a…

m4a怎么转换mp3格式?详细的步骤

有经常下载歌曲的小伙伴们&#xff0c;一定遇到过m4a格式的音频文件&#xff0c;这种格式的音频文件因为自身适配性的原因&#xff0c;导致很多播放器是无法对其进行正常播放&#xff0c;所以用户要想使用此格式的视频&#xff0c;就不得不把它转成主流格式mp3&#xff0c;这样…

m4a音频转换mp3格式的方法

很多朋友都在问m4a音频转换mp3格式的方法这个问题&#xff0c;小编根据大家的实际要求和诉求在网上寻找了很多的m4a转换成mp3的方法&#xff0c;这些方法都可以将m4a转换成mp3&#xff0c;但是在速度和稳定性方面有所差异。尤其是在使用的软件方面&#xff0c;每个软件中所具备…

m4a格式怎么转换成mp3,非常简单

m4a格式怎么转换成mp3&#xff1f;m4a是一种文件的扩展名&#xff0c;确切的说是一种音频文件格式。 为了区分mpeg-4中的音频和视频文件&#xff0c;苹果率先使用m4a格式替换了mpeg-4中的音频文件扩展名。 因为m4a主要应用于苹果手机&#xff0c;苹果手机的用户量很大&#xff…

如何把m4a转换成mp3?音频格式转换步骤

最近有好多朋友反映自己手机录音机里文件是m4a格式的&#xff0c;那这样m4a格式的音频在音响&#xff0c;播放器或者很多别的软件中都是无法进行播放的&#xff0c;而且m4a格式的音频在传输中还会受到一定的限制&#xff0c;这个时候我们就需要把m4a转换成常用的Mp3音频格式来完…