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都不支持上述事件
文中如有錯誤,還請各位大俠及時告知。