canvas相关属性使用

1.canvas按百分比画圆环

可以使用canvas的arc属性画出圆环,百分比部分换算成弧度即可。

2.canvas的font属性没法单独设置,必须设置两个及以上相关属性。

如果要通过传入的值来改变font属性的参数,可以通过正则匹配表达式,replace方法来实现,

如改变字号:

  context.font = "italic 12px/20px arial";
  context.font = context.font.replace(/\d+(\.\d+)?(px|pt|em|%)/i,"17px");//替换字体大小
  context.font = context.font.replace(/(\/\s*)\d+(\.\d+)?(px|pt|em|%)/i,"$1"+"27px");//替换Line高度

3.canvas画椭圆

  canvas没有提供直接画椭圆的方法,可以通过scale()的方法,对圆进行压缩,达到画椭圆的目的。

    技巧就在先save保存画布状态,然后缩放、调用路径指令,再restore恢复画布状态,再stroke绘制出来。

关键点是先save后缩放,先restore后stroke.

//------------均匀压缩法绘制椭圆--------------------
function EvenCompEllipse(context, x, y, a, b)
{
   context.save();
   //选择a、b中的较大者作为arc方法的半径参数
   var r = (a > b) ? a : b;
   var ratioX = a / r; //横轴缩放比率
   var ratioY = b / r; //纵轴缩放比率
   context.scale(ratioX, ratioY); //进行缩放(均匀压缩)
   context.beginPath();
   //从椭圆的左端点开始逆时针绘制
   context.moveTo((x + a) / ratioX, y / ratioY);
   context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI);
   context.closePath();  context.restore();  context.stroke();
};

均匀压缩法

这种方法利用了数学中的均匀压缩原理将圆进行均匀压缩为椭圆,理论上为能够得到标准的椭圆.下面的代码会出现线宽不一致的问题,解决办法看5楼simonleung的评论。

//------------均匀压缩法绘制椭圆--------------------
//其方法是用arc方法绘制圆,结合scale进行
//横轴或纵轴方向缩放(均匀压缩)
//这种方法绘制的椭圆的边离长轴端越近越粗,长轴端点的线宽是正常值
//边离短轴越近、椭圆越扁越细,甚至产生间断,这是scale导致的结果
//这种缺点某些时候是优点,比如在表现环的立体效果(行星光环)时
//对于参数a或b为0的情况,这种方法不适用
function EvenCompEllipse(context, x, y, a, b)
{
   context.save();
   //选择a、b中的较大者作为arc方法的半径参数
   var r = (a > b) ? a : b; 
   var ratioX = a / r; //横轴缩放比率
   var ratioY = b / r; //纵轴缩放比率
   context.scale(ratioX, ratioY); //进行缩放(均匀压缩)
   context.beginPath();
   //从椭圆的左端点开始逆时针绘制
   context.moveTo((x + a) / ratioX, y / ratioY);
   context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI);
   context.closePath();
   context.stroke();
   context.restore();
};
时间: 2024-11-08 18:18:26

canvas相关属性使用的相关文章

用Canvas和属性动画造一只萌蠢的“小鬼”

最近没事的时候想自己写一个支持下拉刷新,上拉加载的自定义View.写着写着,就觉得最常见的"一个圈转啊转"的进度条太普通了. 于是,就想看看有没有更有趣的一点的加载效果.在GitHub上以"android loading"为关键字一搜索,就发现有作者开源了这么一个库: 库的地址是:https://github.com/ldoublem/LoadingView.里面提供了很多有趣的加载动画(非常棒),个人对其中如下一个效果产生了兴趣: 那么,开源的好处就来了,立刻打开

cocos2dx 3.x以上(Sprite精灵类的相关属性与创建)

// //  MainScene.cpp //  helloworld // //  Created by apple on 16/9/19. // // #include "MainScene.hpp" Scene * MainScene::createScene() { auto scene = Scene::create(); //    CCScene * scene = CCScene::create();// 创建场景 //创建层 MainScene *layer = Ma

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

前端笔记九,背景、边框和补丁相关属性

常用的背景相关属性:以下属性均在style内设置 background:设置对象的背景样式,不建议直接通过该属性来控制 background-attachment:设置背景图片是随对象内容滚动还是固定的,可选值: scroll:会随内容的滚动而滚动 fixed:背景图片固定 background-color:设置背景色,如果设置了背景图片则会覆盖背景色 background-image:设置背景图片,使用url()函数 background-position:设置对象的背景图片的位置,第一个表示

Android总结篇系列:Activity Intent Flags及Task相关属性

同上文一样,本文主要引用自网上现有博文,并加上一些自己的理解,在此感谢原作者. 原文地址: http://blog.csdn.net/liuhe688/article/details/6761337 -------------------------------------------------------------------------- 今天我们来讲一下Activity的task相关内容. 上次我们讲到Activity的四种启动模式的时候,已经了解到一些关于task的技术,今天我再向大

css3背景、边框、和补丁相关属性

border :基本语法 border: border-width || border-style || border-color 默认值为: medium none . border-color 的默认值将采用文本颜色 相关属性: border-top,border-left,border-right,border-bottom:它们分别对边框的某个方向起作用,语法基本与border相同 border-bottom-color,border-top-color,border-bottom-co

extjs的相关属性

通用属性: labelSeparator:''//表示fieldLabel后不会显示冒号":" readOnly:true//只读 focusCls: 'txtHalfInput'//有焦点时的样式 maxLength:3, enforceMaxLength:true//输入位数check fieldStyle: 'margin-top:3px;'//display上下不对齐解决办法 Ext.button.Button 属性: enableToggle:true//设置按钮为开关状态

【html】学习记录-CSS的column相关属性

column相关属性: column-count:定义内容以多列形式显示 column-gap:定义每列之间的间距 示例: <section class="fourcolumn"> 人类或其他任何活着的个体,在生命之初不是放弃,不是自我唾弃,也不是对自己的存在进行诅咒.那些都是需要一个腐败和堕落的过程的,这一腐败的速度因人而异.有些人刚碰到压力便放弃了:有些人出卖和背叛了自己的意识:有些人不知不觉地慢慢熄火了,却从不知道自己何时已经失去了这种意识.然后,长者们蜂拥而上,百折

UILabel的相关属性设置

在iOS编程中UILabel是一个常用的控件,下面分享一下UILabel的相关属性设置的方法. 很多学习iOS6编程都是从storyboard开始,用到UILabel时是将控件拖到storyboard中生成实现,如果想要在-(void)viewDidLoad中用代码如[_label initWithFrame:CGRectMake(X,Y,WIDTH,HEIGHT)]方法改变拖拽到storyboard的label的大小是行不通的,因为程序加载时先执行了-(void)viewDidLoad的代码,