打卡记-canvas图片、二维码、动画、点击

需求一:用canvas生成一张图片,用户长按可保存,效果图:


看效果图可以看出,这里面涉及到了几个功能点:

如何适配手机屏幕 / 文字如何居中 / 如何生成二维码 / 如何在加载图片后绘制 / canvas脏画布问题

下面就一个个来解决这些问题。

移动端大小适配(有问题):

getInitialState:function(){return{cvsWidth:window._rem *9.375,cvsHeight:window._rem *12};},

文字居中显示

CanvasRenderingContext2D.measureText():可以测量字体的宽度

ctx.fillText("测试",(this.state.cvsWidth - ctx.measureText("测试").width)/2,startY);

二维码的生成

思路是,先生成canvas二维码,再将canvas转成图片,然后画到canvas中。

letQR =require("arale-qrcode");letqrObject =newQR({render:"canvas",text:"https://weixiao.qq.com",size: WindowRem*1.875

});letqrcodeSrc = qrObject.toDataURL("image/png",1.0);

这里使用了一个生成二维码的库arale-qrcode,地址:https://github.com/aralejs/qrcode

图片的加载

在用canvas绘制图片过程中会遇到一个问题是,当canvas在画这张图片的时候,实际上这张图片还没有加载完成。结果当canvas转化成图片的时候画出来的是一张空白图片。针对这个问题,可以这样解决:

if(img.complete || img.complete === undefined) {ctx.drawImage(img,startX,startY,imgSize,imgSize);}else{    img.onload =()=>{ctx.drawImage(img,startX,startY,imgSize,imgSize);};}

toDataURL的跨域问题

在canvas中,不在本站域名中的图片默认只可读不可写,也就是说,你可以将一张非本站点图片画到canvas中,但你无法使用toBlob(),toDataURL() 或 getImageData() 方法,否则会报错。

这就很麻烦,因为图片中有cdn的图片,还有从微信拉过来的头像图片。

网络中的方法是:

img.setAttribute("crossorigin","anonymous");

 可是我试了一下没有用,可能是服务端阻止了图片的拉取。

于是换了一种解决方案,将图片转化成base64,解决了。

需求二:画一张统计饼图,带动画和点击,效果图:

canvas动画

MDN上给出了用canvas绘制动画的基本思路,简单来说就是,画一帧,擦除画布,再画下一帧,再擦除...

如果你是画那种一直在动的动画,像时钟、太阳系这种,可以引用 window.requestAnimationFrame()方法。

如果是画一段,然后停止的话,可以用setInterval方法:

cvsFrame:function(){    let_this =this,speed =0;    letdrawProcess = setInterval(function(){        _this.state.ctx.clearRect(0,0, _this.state.cvs.width, _this.state.cvs.height);_this.doCanvas(speed);if(speed >=100) {    clearInterval(drawProcess);}speed +=2;  },10);},

canvas点击事件

要点击canvas并出现一些效果,主要就是获取鼠标点击的位置。

在移动端可绑定的点击事件有onTouchStart和onTouchEnd,

当绑定onTouchStart时,获取鼠标位置的方式是:

lettouch = e.touches[0],    mx = touch.clientX ,    my = touch.clientY ;

当绑定onTouchEnd时,获取鼠标位置的方式是:

e.changedTouches

P.s:移动端无法用onClick绑定事件的e.clintX、e.screenX、e.layerX获取鼠标位置,这些只适合PC端用。在PC端用e.clintX、e.screenX、e.layerX时,有浏览器兼容问题,layerX是Firefox的特有属性。用错的话会undefined的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,661评论 2 32
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,490评论 0 4
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,934评论 3 40
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,027评论 0 2
  • 文/书范乘风 我常仰面对天 指其而问之 谁是独坐红尘之外的人呢 谁能独坐水穷之处 看白云初升 花开花落 人们都是在...
    范乘风阅读 629评论 1 7