page2上的canvas可交互,并实时显示交互结果;ios
点击下一步,page2消失,page3显示;web
page3显示的是一张图片,图片有canvas交互区和另外的一些元素组成。canvas
运用canvas重绘的方法能够实时同步canvas的交互结果。
canvas重绘:在canvas有交互操做时,先清空画布,将canvas中全部的元素都从新画到画布上;跨域
var fillTextArr = function(el){ //清空画布 el.clearRect(0, 0, width, height); el.beginPath(); //绘制 };
这里只需绘制封装的cavas元素对象绘制缓存
交互只需操做封装的对象,改变对象的属性,如颜色,文本等。微信
以下图,点击下一步时,将底部元素绘制到cavas,最后将总体canvas取出为图片显示;函数
合成要进行的操做测试
将交互区canvas绘制到缓存cachecanvas中编码
将图片底部绘制到cachecanvas中spa
cacheCanvas转换为图片
一、3两点均可以用
drawImage
方法实现
drawImage(_image_, _x_, _y_) drawImage(_image_, _x_, _y_, _width_, _height_) drawImage(_image_, _sourceX_, _sourceY_, _sourceWidth_, _sourceHeight_, _destX_, _destY_, _destWidth_, _destHeight_) //第一个参数表示 <img> 标记或者屏幕外图像的 Image 对象,或者是 Canvas 元素。
注:src为base64编码的img对象,在微信ios客户端中,被用作drawImage的第一个参数时,不会绘制到canvas上,且不报错
//取出canvas的Base64编码 var dataImg = canvas.toDataURL('image/png');
重置page3中的<img src="" alt="" id="result"/>
;
img标签能够解析base64编码为图片
$('#result').attr('src', dataImg);
微信中执行var dataImg = canvas.toDataURL('image/png');
此条语句时,当前的canvas
中的图片,不能有跨域的图片资源,例如:
var img = new Image(); img.src = "跨域的图片地址"; img.onload = fucntion(){ canvas.drawImage(img,0,0,100,100); } //在微信中时,本行代码不执行。 var dataImg = canvas.toDataURL('image/png');
微信安卓客户端长按保存base64编码格式的图片时,保存失败
ios长按保存正常
解决:将base64编码给后台,后台处理成jpg等经常使用格式的图片,返回图片保存的地址。
缘由:移动端click事件形成;
参考信息
canvas { -webkit-tap-highlight-color: rgba(0,0,0,0); }
因为使用的判断点击位置的方法依赖于:layerX 、layerY、offsetX、offsetY
var getEventPosition = function(ev){ var x, y; if (ev.layerX || ev.layerX == 0) { x = ev.layerX; y = ev.layerY; } else if (ev.offsetX || ev.offsetX == 0) { // Opera x = ev.offsetX; y = ev.offsetY; } return {x: x, y: y}; };
touch事件对layerX 、layerY、offsetX、offsetY
支持测试以下(此处未深究,仅供参考):
ios微信 touchstart的e.touches[0]
支持,安卓不能够
微信,ios、安卓都的click都支持上述函数,都有延迟,可是ios会闪烁
微信,ios、安卓的tap都不支持上述事件
文中如有错误,还请各位大侠及时告知。