详解canvas在圆弧周围绘制文本的两种写法


Posted in HTML / CSS onMay 22, 2018

教程是直接按弧度进行编写的

自己又试着用角度重新编写了一份,有些差别,总结起来还是用弧度比较方便,当然两种哪种理解的容易可以自行斟酌

写代码有时候不一定要按照教程一板一眼的写,最佳实践固然是好,但是自己尝试些别的也许有些别的收获不是么~

效果如下图

详解canvas在圆弧周围绘制文本的两种写法

第一种是直接用弧度的

var canvas=document.getElementById("canvas")
    var context=canvas.getContext("2d")

    var TEXT_FILL_STYLE="rgba(100,130,240,0.5)"
    var TEXT_STROKE_STYLE="rgba(200,0,0,0.7)"
    var TEXT_SIZE=64;
    circle={
        x:canvas.width/2,
        y:canvas.height/2,
        radius:200
    }
    function drawCircularText(string,startAngle,endAngle){
      var radius=circle.radius //圆的半径
      var angleDecrement=(startAngle-endAngle)/(string.length-1)//每个字母占的弧度
      var angle=parseFloat(startAngle) //转一下数字
      var index=0;
      var character;

      context.save()
      context.fillStyle=TEXT_FILL_STYLE;
      context.strokeStyle=TEXT_STROKE_STYLE;
      context.font=TEXT_SIZE+"px Lucida Sans"

      while(index<string.length){
        character=string.charAt(index)
        context.save()
        context.beginPath()
        context.translate(circle.x+Math.cos(angle)*radius,circle.y-Math.sin(angle)*radius)
        context.rotate(Math.PI/2-angle)   //Math.PI/2为旋转90度  Math.PI/180*X为旋转多少度
        context.fillText(character,0,0)
        context.strokeText(character,0,0)
        angle-=angleDecrement
        index++
        context.restore()

      }
      context.restore()
    }
    context.textAlign="center"
    context.textBaseLine="middle"
   drawCircularText("clockwise around the circle",Math.PI*2,Math.PI/8)  //第三个参数表示文字首位是否相接 差了多少弧度

第二种是用角度带入的 请注意drawCircularText的第二个参数和第三个参数的不同

var canvas=document.getElementById("canvas")
    var context=canvas.getContext("2d")

    var TEXT_FILL_STYLE="rgba(100,130,240,0.5)"
    var TEXT_STROKE_STYLE="rgba(200,0,0,0.7)"
    var TEXT_SIZE=64;
    circle={
        x:canvas.width/2,
        y:canvas.height/2,
        radius:200
    }
    function drawCircularText(string,startAngle,endAngle){
      var radius=circle.radius //圆的半径
      var angleDecrement=(startAngle-endAngle)/(string.length-1)//每个字母占的弧度
      var angle=startAngle //
      
      var index=0;
      var character;

      context.save()
      context.fillStyle=TEXT_FILL_STYLE;
      context.strokeStyle=TEXT_STROKE_STYLE;
      context.font=TEXT_SIZE+"px Lucida Sans"

      while(index<string.length){
        character=string.charAt(index)
        context.save()
        context.beginPath()
        context.translate(circle.x+Math.cos((Math.PI/180)*angle)*radius,circle.y-Math.sin((Math.PI/180)*angle)*radius)
        context.rotate((Math.PI/2)-(Math.PI/180)*angle)   //Math.PI/2为旋转90度  Math.PI/180*X为旋转多少度
        context.fillText(character,0,0)
        context.strokeText(character,0,0)
        angle-=angleDecrement
        index++
        context.restore()

      }
      context.restore()
    }
    context.textAlign="center"
    context.textBaseLine="middle"
   drawCircularText("clockwise around the circle",360,10)  //第三个参数表示文字首位是否相接 差了多少弧度

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
HTML5和CSS3让网页设计提升到下一个高度
Aug 14 HTML / CSS
CSS3模块的目前的状况分析
Feb 24 HTML / CSS
html5 css3 动态气泡按钮实例演示
Dec 02 HTML / CSS
使用css3实现超炫的loading加载动画效果
May 07 HTML / CSS
CSS3解析抖音LOGO制作的方法步骤
Apr 11 HTML / CSS
HTML5 video标签(播放器)学习笔记(一):使用入门
Apr 24 HTML / CSS
使用phonegap创建联系人的实现方法
Mar 30 HTML / CSS
html5使用canvas实现弹幕功能示例
Sep 11 HTML / CSS
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
Jul 12 HTML / CSS
Html5页面二次分享的实现
Jul 30 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
May 08 HTML / CSS
详解CSS开发过程中的20个快速提升技巧
May 21 HTML / CSS
HTML5 device access 设备访问详解
May 24 #HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
May 25 #HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
May 28 #HTML / CSS
HTML5探秘:用requestAnimationFrame优化Web动画
Jun 03 #HTML / CSS
html5触摸事件判断滑动方向的实现
Jun 05 #HTML / CSS
使用Canvas操作像素的方法
Jun 14 #HTML / CSS
Html5移动端获奖无缝滚动动画实现示例
Jun 25 #HTML / CSS
You might like
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
PHP学习 变量使用总结
2011/03/24 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
探讨:php中在foreach中使用foreach ($arr as &amp;$value) 这种类型的解释
2013/06/24 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
2015/06/21 Python
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python监控nginx端口和进程状态
2019/09/06 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
应届生服务员求职信
2013/10/31 职场文书
中专生的个人自我评价
2013/12/11 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
参赛口号
2014/06/16 职场文书
教师一帮一活动总结
2014/07/08 职场文书
共青团员自我评价范文
2014/09/14 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技