婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 如何用canvas實現(xiàn)在線簽名的示例代碼

如何用canvas實現(xiàn)在線簽名的示例代碼

熱門標簽:云南大理400電話申請官方 成都智能外呼系統(tǒng)平臺 電銷機器人電話用什么卡 南寧點撥外呼系統(tǒng)哪家公司做的好 江蘇智能電銷機器人哪家好 當(dāng)涂高德地圖標注 鎮(zhèn)江智能外呼系統(tǒng)有效果嗎 黃島區(qū)地圖標注 四川點撥外呼系統(tǒng)

隨著計算機和網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,在線簽名技術(shù)越來越多的被應(yīng)用在無紙化辦公中,這種直觀便利的操作不僅可以大幅提升辦公效率,而且使用數(shù)字化存儲方式,避開了傳統(tǒng)的紙質(zhì)簽字存儲查閱困難等問題。在我們在日常生活中,已經(jīng)有很多場景使用在線簽名技術(shù),例如:pos機刷卡簽字、快遞簽收簽字、銀行或機關(guān)單位業(yè)務(wù)辦理簽字等。最近在做公司的業(yè)務(wù)辦理需求,里面也涉及到在線簽名,我們采用的 Canvas 技術(shù)實現(xiàn),接下來,讓我們來聊聊如何使用 Canvas 實現(xiàn)在線簽名吧!

什么是 Canvas?

Canvas 是 HTML5 新增的元素,用于在網(wǎng)頁上繪制圖形,它由 Apple 在 Safari 1.3 Web 瀏覽器中引入,之所以對 HTML 擴展的原因在于, HTML 在 Safari 中的繪圖能力能為 Mac OS X 桌面的 Dashboard 組件所使用,并且 Apple 也希望有一種方式可以在 Dashboard 中支持腳本化的圖形。Firefox 1.5 和 Opera 9 這兩個瀏覽器也緊隨 Safari 的引領(lǐng),開始支持 Canvas 。

現(xiàn)在,Canvas 標簽已經(jīng)是 HTML5 最偉大的改進之一,因為它可以讓我們在不使用圖片的情況下實現(xiàn)網(wǎng)頁的圖形設(shè)計。它就像一塊畫布,本身沒有繪制能力,但卻把繪制 API 展現(xiàn)給客戶端 JavaScript,我們借助 JavaScript 的支持,在畫布范圍內(nèi)盡情發(fā)揮,達到想要的效果。

技術(shù)選型

這個功能無論是 Canvas、SVG 或是 Flash,都可以實現(xiàn),但是我們?yōu)槭裁催x擇了 Canvas 呢?

首先,由于功能上我們需要支持移動平臺,所以 Flash 我們就可以直接棄掉,它在移動端方面并沒有得到友好的支持,但 Canvas 和 SVG 都具有很好的跨平臺能力,我們?nèi)绾尉駬瘢旅嫖覀儊韺Ρ纫幌隆?/p>

  •  Canvas 基于像素,提供 2D 繪制函數(shù),提供的功能更原始,適合像素處理、動態(tài)渲染和大數(shù)據(jù)量繪制,可控性高,繪制完了基本不記錄過程,繪圖性能會更好一點,各大廠商也早都實現(xiàn)了canvas的硬件加速機制。  
  • SVG 為矢量,提供一系列圖形元素,功能更完善,建立了一大堆可交互對象,本性長于交互,但性能會弱些,更適合靜態(tài)圖片展示,高保真文檔查看和打印的應(yīng)用場景。

兩者各有自己的擅長領(lǐng)域, 基于以上,我們選擇了 Canvas 來實現(xiàn)簽字功能。

下面,我們來看一下實現(xiàn)效果。

了解了 Canvas 來源、技術(shù)選型和最終呈現(xiàn)效果,接下來、我們會從創(chuàng)建、繪制、監(jiān)聽、重繪、圖片處理等五部分進行撰寫,讓我們一起走進 Canvas 繪制的世界。

創(chuàng)建畫布

首先,我們需要判斷瀏覽器是否支持 Canvas :

isCanvasSupported = (): boolean => {
    let elem = document.createElement('canvas');
    return !!(elem.getContext && elem.getContext('2d'));
}

然后根據(jù)判斷結(jié)果選擇創(chuàng)建 Canvas 畫布還是展示提示

{isCanvasSupported ?
     <canvas ref={canvas => (this.canvas = canvas)} height={canvasHeight} width={canvasWidth}>
    :對不起,當(dāng)前瀏覽器暫不支持此功能!
}

我們知道,每個 Canvas 節(jié)點都有一個對應(yīng)的 context 對象, 我們可以通過 Canvas 對象的 getContext() 方法,直接把量字符串 “2d” 作為唯一的參數(shù)傳遞給它來獲取。接下來,我們通過 ref 獲取 Canvas 元素,再通過 getContext() 方法得到一個畫布上繪圖的環(huán)境。

let cxt = this.canvas.getContext('2d');
this.setState({cxt: cxt});

環(huán)境已經(jīng)準備妥當(dāng),接下來我們就開始進行繪制工作吧!

繪制

首先繪制開始路徑:

cxt.beginPath();

然后設(shè)置當(dāng)前線條的寬度:

cxt.lineWidth = 5;

設(shè)置線條的顏色:

cxt.strokeStyle = '#000';

通過 moveTo 和 lineTo ,我們來繪制一條線

cxt.moveTo(0,0);
cxt.lineTo(150,0);
// 繪制已定義的路徑
cxt.stroke()

但是,我們發(fā)現(xiàn)繪制的線條比較生硬

這時,我們可以通過 lineCap 改變線條末端線帽的樣式,為每個末端添加圓形線帽,減少線條的生硬感

cxt.lineCap = 'round';

同時,我們還可以通過設(shè)置 lineJoin,指定條線交匯時為圓形邊角

cxt.lineJoin = 'round';

但我們又發(fā)現(xiàn),繪制的線條有明顯的鋸齒,此時我們就需要借助 Canvas 為我們提供的繪制元素陰影的功能來模糊邊緣出現(xiàn)的鋸齒,因為有陰影,所以我們可以適當(dāng)改變 lineWidth 值

cxt.shadowBlur = 1;
cxt.shadowColor = '#000';

是不是變得圓潤很多,到這里,我們繪制線路的方法已經(jīng)準備完事,接下來我們來看一下怎么監(jiān)聽畫布事件來實現(xiàn)連貫執(zhí)行繪制吧!

監(jiān)聽畫布事件

因為我們需要同時兼容 PC 端和移動端,所以我們需要事先需要判斷一下對應(yīng)執(zhí)行的事件

this.state = {
events: ('ontouchstart' in window) ? ['touchstart', 'touchmove', 'touchend'] : ['mousedown', 'mousemove', 'mouseup']
}

在畫布初始化之后,我們開始監(jiān)聽 events[0] 事件

this.canvas.addEventListener(this.events[0], startEventHandler, false);

在startEventHandler函數(shù)中監(jiān)聽 events[1] 和 events[2] 事件

this.canvas.addEventListener(events[1], moveEventHandler, false);
this.canvas.addEventListener(events[2], endEventHandler, false);

重點來了,我們核心的內(nèi)容就是計算、描繪劃過的路徑

moveEventHandler(event: any): void {
    event.preventDefault();
    const {ctx, isSupportTouch} = this.state;
    const evt = isSupportTouch ? event.touches[0] : event;
    const coverPos = this.canvas.getBoundingClientRect();
    const mouseX = evt.clientX - coverPos.left;
    const mouseY = evt.clientY - coverPos.top;
    cxt.lineTo(
       mouseX,
       mouseY
    );
    cxt.stroke();
}

了解 Canvas 的知道, Canvas 畫布為我們提供了一個用來作圖的平面空間,該空間的每個點都有自己的坐標,x 表示橫坐標,y 表示豎坐標。原點 (0, 0) 位于圖像左上角,x 軸的正向是原點向右,y 軸的正向是原點向下。

于是我們通過 getBoundingClientRect() 方法獲得頁面 Canvas 元素相對瀏覽器視窗的位置左邊和頂部的像素距離,再利用 clientX,clientY 事件屬性返回當(dāng)事件被觸發(fā)時鼠標指針向?qū)τ跒g覽器頁面的水平和垂直坐標,最后通過 lineTo 和 stroke 來繪制路徑。

同時,我們要記得在 events[2] 事件執(zhí)行之后,移除 events[1]、events[2] 事件,否則會造成一直繪制。

endEventHandler(event: any): void {
    event.preventDefault();
    const {events, moveEventHandler, endEventHandler} = this.state;
    this.canvas.removeEventListener(events[1], moveEventHandler, false);
    this.canvas.removeEventListener(events[2], endEventHandler, false);
}

如此反復(fù)循環(huán)上述事件操作,我們的簽字功能就基本實現(xiàn)了。

重新繪制

簽字過程中,簽錯或是簽的過于潦草是必不可免的,所以我們需要支持清空簽字的功能,這時,我們利用 Canvas 的 clearRect() 方法就可以幫助我們清除畫布區(qū)域內(nèi)容。

cxt.clearRect(0, 0, canvasWidth, canvasHeight);

圖片處理

繪制之后我們還沒完事,我們還需要把繪制的簽名上傳保存。這時,我們可以利用 toDataURL() 方法將 Canvas 轉(zhuǎn)化成一般的圖像文件形式。

通常我們直接執(zhí)行以操作就能轉(zhuǎn)化成 data URI,然后再利用 ajax 請求上傳就完事了。

dataurl = this.canvas.toDataURL('image/png');
//or
dataurl = this.canvas.toDataURL('image/jpeg', 0.8);

但是,由于各種業(yè)務(wù)需求,我們有時需要攜帶頁面其他內(nèi)容,這時,我們可以借助 html2canvas 來實現(xiàn)。html2canvas 可以幫助我們對瀏覽器端整個或部分頁面進行截屏,并渲染成一個 Canvas ,然后我們在利用 toDataURL() 方法進行處理。

說道 html2canvas,順便給大家一個繞坑提示,它在一些低版本瀏覽器截出來的圖片是空白的,原因是使用了flex 布局,而html2canvas并不支持 -webkit-flex 或 -webkit-box,所以無法將 HTML 生成 Canvas,從而導(dǎo)致了截出一張白屏。

解決辦法:

  • 不使用flex布局
  • 修改 html2canvas 源碼,在html2canvas\dist\npm\parsing\display.js 文件中增加 -webkit-flex 和 -webkit-box 也返回 DISPLAY.FLEX; 小結(jié)

通過以上幾步,我們就基本實現(xiàn)了在線簽名的功能。值得注意的是,這個項目我們使用的 React+TypeScript 環(huán)境構(gòu)建,上述代碼的實際使用需要結(jié)合自己環(huán)境進行適當(dāng)修改。

文中使用的是 Canvas 比較淺層的繪制知識,如果想利用Canvas進動畫制作、物理效果模擬、碰撞檢測、游戲開發(fā)、移動應(yīng)用開發(fā)、大數(shù)據(jù)可視化開發(fā),還需要我們復(fù)習(xí)一下之前學(xué)過的數(shù)學(xué)幾何、物理方面的知識,然后在慢慢摸索?,F(xiàn)在很多成熟的圖表插件都是用 Canvas 實現(xiàn)的,例如 Chart.js、ECharts等,里面很多好看炫酷的圖表,幾乎覆蓋了所有圖表的實現(xiàn)。Canvas還有很多開源類庫,例如 ZRender、createJS、Pixi.js等,ECharts底層也是依賴輕量級的 Canvas 類庫 ZRender 進行封裝的。

好了,我們今天就先聊到這里,如有任何疑問,還請留言。以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。 

標簽:酒泉 廣西 西寧 淮安 咸寧 佳木斯 十堰 南京

巨人網(wǎng)絡(luò)通訊聲明:本文標題《如何用canvas實現(xiàn)在線簽名的示例代碼》,本文關(guān)鍵詞  如,何用,canvas,實現(xiàn),在線,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《如何用canvas實現(xiàn)在線簽名的示例代碼》相關(guān)的同類信息!
  • 本頁收集關(guān)于如何用canvas實現(xiàn)在線簽名的示例代碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品久线在线观看| 久久福利资源站| 日韩欧美久久久| 午夜电影一区二区三区| 亚洲狠狠丁香婷婷综合久久久| 亚洲伦理在线免费看| 美女一区二区三区在线观看| 美女性感视频久久| 日本高清免费不卡视频| 欧美一区二区视频在线观看 | 欧美大片免费久久精品三p| 久久久久国产精品厨房| 久久99久久精品欧美| 欧美综合在线视频| 亚洲午夜在线观看视频在线| 色婷婷av久久久久久久| 久久久美女艺术照精彩视频福利播放| 一区二区三区四区不卡在线 | 9l国产精品久久久久麻豆| 精品一区二区三区欧美| 欧美影院一区二区| 免费观看在线综合色| 91麻豆免费看| 久久国产精品第一页| 久久综合一区二区| 在线观看91视频| 国产真实乱偷精品视频免| 一区二区三区自拍| 国产欧美日韩三级| 91日韩精品一区| 亚洲18女电影在线观看| 久久久久国产精品人| 69久久夜色精品国产69蝌蚪网| 国产一区在线不卡| 性做久久久久久免费观看| 国产精品久久久久久久久免费相片| 欧美午夜片在线看| 免费久久99精品国产| 中文字幕高清一区| 欧美精品一区二区三区蜜桃视频| 丰满少妇在线播放bd日韩电影| 亚洲制服丝袜一区| 欧美激情一区二区三区全黄| 欧美成人在线直播| 欧美伊人久久久久久久久影院| 成人免费高清在线观看| 狠狠狠色丁香婷婷综合激情| 日产欧产美韩系列久久99| 亚洲丝袜另类动漫二区| 亚洲免费av在线| 亚洲免费资源在线播放| 精品99久久久久久| 久久久久久久久久电影| 精品国产凹凸成av人导航| 欧美三区免费完整视频在线观看| 成人一区二区三区| 91麻豆6部合集magnet| av午夜一区麻豆| 91在线云播放| 欧美二区三区91| 国产日韩欧美电影| 亚洲精品老司机| 麻豆国产精品一区二区三区| 男女视频一区二区| 久久久av毛片精品| 一区二区国产视频| 一区二区三区中文字幕电影| 91精品啪在线观看国产60岁| 日韩欧美国产wwwww| 日韩视频永久免费| 国产午夜精品一区二区| 精品福利视频一区二区三区| 国产精品久久久久影院| 日韩有码一区二区三区| 99re在线视频这里只有精品| 欧美艳星brazzers| 欧美高清在线精品一区| 日韩1区2区日韩1区2区| 91福利视频久久久久| 亚洲欧美另类在线| 韩国理伦片一区二区三区在线播放| 色妹子一区二区| 日韩伦理免费电影| 九九久久精品视频| 日韩三级高清在线| 日本sm残虐另类| 成人精品高清在线| 2024国产精品| 狠狠色综合日日| 国产日韩欧美精品在线| 蜜桃传媒麻豆第一区在线观看| 欧美亚洲图片小说| 亚洲123区在线观看| 91精品国产丝袜白色高跟鞋| 午夜精品福利一区二区三区蜜桃| 欧美无乱码久久久免费午夜一区| 国产精品久久久久久久裸模| av欧美精品.com| 亚洲国产一区视频| 久久综合给合久久狠狠狠97色69| 国内精品在线播放| 亚洲精品视频在线| 日韩一区二区免费视频| 国产精品资源在线观看| 中文字幕一区二区三区不卡在线| 成人国产精品免费观看视频| 日韩国产欧美一区二区三区| 日韩精品最新网址| 一本在线高清不卡dvd| 久久国内精品自在自线400部| 欧美—级在线免费片| 在线免费观看一区| 日韩精品每日更新| 久久精品网站免费观看| www.在线成人| 婷婷综合五月天| 国产精品久久夜| 91精品国产aⅴ一区二区| 一本色道久久综合狠狠躁的推荐 | 欧美aaa在线| 国产三区在线成人av| 欧美人与性动xxxx| 国产成人午夜高潮毛片| 免费在线看成人av| 日韩电影免费在线| 亚洲自拍偷拍网站| 亚洲综合色自拍一区| 欧美亚洲国产一区二区三区va | 欧美日本精品一区二区三区| 三级成人在线视频| 亚洲激情自拍偷拍| 中文字幕欧美一| 亚洲女同一区二区| 亚洲精品高清视频在线观看| 亚洲丶国产丶欧美一区二区三区| 欧美一区二区美女| 国产不卡在线一区| 国产精品亚洲人在线观看| 蜜桃精品在线观看| 亚洲国产精品国自产拍av| 国产精品久久久久久妇女6080| 亚洲国产高清aⅴ视频| 亚洲欧美日韩电影| 亚洲综合成人网| 男人的天堂久久精品| 国产一区二区三区久久久| 极品尤物av久久免费看| 免费人成精品欧美精品| 韩国女主播成人在线| 肉丝袜脚交视频一区二区| 精油按摩中文字幕久久| 国产在线视视频有精品| 91精品国产综合久久香蕉的特点| 欧美日本一道本| 精品日韩成人av| 亚洲免费在线播放| 欧美电视剧在线观看完整版| 国产精品进线69影院| 美女网站色91| 色综合久久中文字幕综合网| 欧美一级搡bbbb搡bbbb| 一级中文字幕一区二区| 国产v日产∨综合v精品视频| 色欧美日韩亚洲| 国产精品系列在线| 国内成人免费视频| 91浏览器在线视频| 中文字幕中文在线不卡住| 国产ts人妖一区二区| 久久久影院官网| 成人国产精品视频| 亚洲欧洲99久久| 一本一道久久a久久精品 | 国产综合久久久久久久久久久久| 制服丝袜亚洲网站| 国产在线乱码一区二区三区| 久久综合久久鬼色中文字| 国内精品伊人久久久久av影院| 精品少妇一区二区三区日产乱码| 国产.欧美.日韩| 国产精品短视频| 欧美r级电影在线观看| 99麻豆久久久国产精品免费| 五月天精品一区二区三区| 欧美国产精品中文字幕| 欧美猛男男办公室激情| 精品无码三级在线观看视频| 欧美va亚洲va在线观看蝴蝶网| 成人综合婷婷国产精品久久蜜臀 | 久久久久99精品国产片| 成人免费黄色在线| 爽好久久久欧美精品| 亚洲精品成人少妇| 国产精品国产三级国产普通话99 | 日本伊人色综合网| 亚洲香肠在线观看| 久久av资源网| av成人免费在线| 成人性色生活片免费看爆迷你毛片| 91麻豆国产香蕉久久精品|