摘要:最近接觸移動端開發(fā)。自己寫一個類似微博的圖片預覽器來學習一下移動端手勢的實現(xiàn)和的屬性的使用。在發(fā)生時將坐標位置向減得到位移量。雙手勢單手勢雙手勢單手勢觸發(fā)移動事件圖片放大功能的實現(xiàn)我采用了的屬性進行縮放,并且設置來設置縮放中心位置。
最近接觸vue.js移動端開發(fā)。自己寫一個類似微博的圖片預覽器來學習一下移動端手勢的實現(xiàn)和css3的屬性的使用。
目標分析首先分析圖片預覽器的功能:
1.圖片顯示
2.縮放(swipe)圖片
3.拖拽圖片(drag)
3.雙擊(doubleTap)放大/縮小
4.單擊(tap)隱藏圖片
5.左右滑到前一頁或后一頁
分析的手勢有:單擊(tap) 雙擊(doubleTap) 縮放(swipe) 拖拽(drag)
都是由有三個事件構成:touchstart, touchmove,touchend.
單擊(tap)
手勢分解:點擊進入touchstart事件,touchmove幾乎沒有,但是也要為用戶預留點擊時的微小移動,再觸發(fā)touchend事件。在本組件中touchmove移動半徑設置為小于10
從觸摸屏幕到離開屏幕的時間是非常短的,所以touchstart事件到touchend事件之間的時間間隔是非常小的,不超過500毫秒。t2-t1<500
代碼實現(xiàn):
onTouchstart(evt){ this.startTime = new Date().getTime(); if(evt.touches.length>1){//雙手勢 }else{//單手勢 this.start.x = evt.touches[0].pageX; this.start.y = evt.touches[0].pageY; } } onTouchMove(evt){ this.move.x = evt.touches[0].pageX; this.move.y = evt.touches[0].pageY; } onTouchEnd(evt){ let timestamp = new Date().getTime(); if(this.move.x !== null && Math.abs(this.move.x - this.start.x)< 10 ||this.move.y !== null && Math.abs(this.move.y - this.start.y)<10){ //有移動的情況 }else{ //單擊 if(timestamp - this.startTime < 500){ //觸發(fā)單擊事件 } } }
雙擊(doubleTap)
雙擊事件包含了兩次單擊事件,區(qū)分在于兩次單擊的時間判斷,兩次單擊的時間,也就是touchstart觸發(fā)的時間間隔,不超過300毫秒,當然,也要給用戶一些觸摸移動的像素,將兩個點的x,y軸上的距離控制在10像素內。
實現(xiàn):
touchStartFn(evt){ this.startTime = new Date().getTime(); if(evt.touches.length>1){//雙手勢 }else{//單手勢 this.start.x = evt.touches[0].pageX; this.start.y = evt.touches[0].pageY; if(this.previousTouchPoint){//上一次的觸摸點 if(Math.abs(this.start.x- this.previousTouchPoint.startX)<10 &&Math.abs(this.start.y- this.previousTouchPoint.startY)<10 && this.startTime - this.previousStartTime < 300){ //觸發(fā)雙擊的事件 ... } } this.previousTouchTime = this.startTime; this.previousTouchPoint = { startX:this.start.x, startY:this.start.y }; } }
如果一個頁面上既有單擊tap事件,又有雙擊doubleTap事件,怎么辦?用上述方法,兩種事件會相互沖突,光靠時間和偏移量來控制是不夠的。
解決思路:初始化this.previousTouchTime = 0;this.previousTouchPoint = undefined;在執(zhí)行完雙擊事件后將this.previousTouchPoint置為undefined,this.previousTouchTime置為0。在觸摸結束事件中添加一個setTimeout來監(jiān)聽是否有新的單擊事件發(fā)生。如果新單擊事件發(fā)生,則去除這個監(jiān)聽,如果沒有,則觸發(fā)單擊事件
touchEndFn(evt){ let timer = setTimeout(()=>{ if(this.previousTouchPoint !== undefined && this.previousTouchTime !== 0){ //觸發(fā)單擊事件 ... }else{ clearTimeout(timer);//去除監(jiān)聽 } },300); }
這樣,單擊和雙擊事件就不會沖突了。
縮放(swipe)
縮放是個雙手勢觸摸過程,觸摸點會有兩個,也就是Touch對象會有兩個。并在觸摸滑動過程中,要計算出縮放倍數(shù)。
point1與point2的觸摸開始位置和結束位置都會有偏移,縮放的倍數(shù)計算:scale = r2/r1
onTouchStart(evt){ if(evt.touches.length>1){//雙手勢 let point1 = evt.touches[0]; let point2 = evt.touches[1]; let deltaX = Math.abs(point2.pageX - point1.pageX); let deltaY = Math.abs(point2.pageY - point1.pageY); this.distance = Math.sqrt(deltaX*deltaX+deltaY*deltaY);//初始時候的距離,r1 }else{ //單手勢事件 } } onTouchMove(evt){ if(evt.touches.legnth>1){ let point1 = evt.touches[0]; let point2 = evt.touches[1]; let deltaX = Math.abs(point2.pageX - point1.pageX); let deltaY = Math.abs(point2.pageY - point1.pageY); let distance = Math.sqrt(deltaX*deltaX+deltaY*deltaY); if(this.distance){ this.swipeScale = distance/this.distance; //執(zhí)行縮放事件 } }else{//單手勢事件} }
拖拽/移動
移動事件就是在觸摸屏幕并移動的時候,圖片或者元素能夠跟隨手指一起移動。這是一個單手勢操作,屏幕上只要一個觸摸點。在touchmove發(fā)生時將坐標位置向減得到位移量。
onTouchStart(evt){ if(evt.touches.length>1){//雙手勢 }else{//單手勢 this.start.x = evt.touches[0].pageX; this.start.y = evt.touches[0].pageY; } } onTouchMove(evt){ if(evt.touches.length>1){//雙手勢 }else{//單手勢 let deltaX = evt.touches[0].pageX - this.start.x; let deltaY = evt.touches[0].pageY- this.start.y; //觸發(fā)移動事件 } }圖片放大功能的實現(xiàn)
我采用了css3的transform屬性進行縮放,并且設置transform-origin來設置縮放中心位置。縮放的倍數(shù)為縮放事件計算出的this.swipeScale
縮放代碼:
$img.style.transform = "scale("+this.swipeScale +")"; $img.style.transformOrigin = x + " " + y;
下一節(jié)將講用vue.js具體實現(xiàn)過程
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92795.html
摘要:默認可選回調函數(shù),綁定業(yè)務數(shù)據(jù)。切換為下一周,與組件內部傳入?yún)?shù)作用一樣,該支持異步成功回調里處理自己的業(yè)務邏輯。 文檔維護者:孫尊路 喜歡的話,記得star 一下噢! 適用場景 前些陣子,寫了一篇《日歷組件實現(xiàn)》的使用在線文檔,遇到一個需求:實現(xiàn)一個H5周歷來填寫每周的工作日志,去網(wǎng)上查閱資料,發(fā)現(xiàn)很多示例也沒有一個標準的使用文檔,感覺用起來也吃力,于是乎,自己造了一個周歷組件,文...
摘要:默認可選回調函數(shù),綁定業(yè)務數(shù)據(jù)。例如某天有日程,則會在對應日期上標識出一個小紅點或者其他標識,默認傳入數(shù)據(jù)格式必選回調函數(shù),當你點擊或輕觸某日期后執(zhí)行。 文檔維護者:孫尊路 喜歡的話,記得star 一下噢! 適用場景 該組件目前僅適用于移動端H5頁面展示,后期高級用法中會講述到如何基于日歷基類實現(xiàn)自定義模板傳入。(即:開發(fā)者只需要傳入自己的模板即可實現(xiàn)出自己的優(yōu)美的日歷出來。) 本篇...
摘要:好簽簽字是一種支持原筆跡手寫的組件,支持端網(wǎng)頁打開,提供手寫簽批功能,支持對文件,插入簽名日期文本等內容。確定保存后簽名文本框消失。支持對已簽字頁使用角標標注。 好簽H5簽字SDK是一種支持原筆跡手寫的組件,支持PC端網(wǎng)頁打開,提供手寫簽批功能,支持對PDF文件,插入簽名、日期、文本等內容。原筆跡手寫引擎是好簽電子簽署系統(tǒng)的核心技術產(chǎn)品之一,是南京好簽軟件技術有限公司自主研發(fā)的具有完全...
閱讀 1002·2021-11-24 10:30
閱讀 2329·2021-10-08 10:04
閱讀 3969·2021-09-30 09:47
閱讀 1452·2021-09-29 09:45
閱讀 1446·2021-09-24 10:33
閱讀 6276·2021-09-22 15:57
閱讀 2360·2021-09-22 15:50
閱讀 4091·2021-08-30 09:45