前言
最近需要使用手指捏合擴大的手勢操作,找了幾個組件,要么對 Vue 適配不好,要么量級太大,決定自己手寫手勢操作,
專案與效果預覽
思路
直接在 DOM 上系結 touchstart 、touchmove、touchend 不僅要系結這幾個事件,而且用在其他專案還不好復用,所以用 Vue 自定義指令比較合適,指令還可以封裝成插件,再使用 npm 托管,這樣隨時隨地都可以使用了,
Vue 自定義指令
Vue 官網就有 自定義指令 的教程,摘取我們需要的關鍵代碼,
Vue.directive('pinch', {
// 只呼叫一次,指令第一次系結到元素時呼叫
bind (el, binding) {
// el:指令所系結的元素,可以用來直接操作 DOM
// binding.value():運行添加到指令的回呼方法
}
})
復制代碼
多點觸控
實作捏合手勢,必然是多根手指操作,因此使用 touch 的多點觸控,就可以拿到多個觸控點的位置了,再通過判斷兩點 touchstart 與 touchend 前的距離偏差,就可以判斷出是捏合手勢,還是放大手勢了,關鍵代碼如下:
let touchFlag = false;
let touchInitSpacing = 0;
let touchNowSpacing = 0;
el.addEventListener('touchstart',(e)=>{
if(e.touches.length>1){
touchFlag = true;
touchInitSpacing = Math.sqrt((e.touches[0].clientX-e.touches[1].clientX)**2 +(e.touches[1].clientY-e.touches[1].clientY)**2);
}else{
touchFlag = false;
}
});
el.addEventListener('touchmove',(e)=>{
if(e.touches.length>1&&touchFlag){
touchNowSpacing = Math.sqrt((e.touches[0].clientX-e.touches[1].clientX)**2 +(e.touches[1].clientY-e.touches[1].clientY)**2);
}
});
el.addEventListener('touchend',()=>{
if(touchFlag){
touchFlag = false;
if(touchInitSpacing-touchNowSpacing>0){
binding.value('pinchin');
}else{
binding.value('pinchout');
}
}
});我是08年出道的高級前端老鳥,有問題或者交流經驗可以進我的扣扣裙 519293536 我都會盡力幫大家哦
使用指令
手勢邏輯寫入自定義指令,就可以直接使用了,
<template>
<div class="pinch" v-pinch="pinchCtrl"></div>
</template>
復制代碼
new Vue({
methods: {
pinchCtrl: function (e) {
if(e==='pinchin'){
console.log('捏合')
}
if(e==='pinchout'){
console.log('擴大');
}
}
}
})
復制代碼
總結
使用 Vue 自定義指令完成手勢操作并不復雜,同時將該邏輯封裝成組件量級很輕,
組件原始碼
點此 查看完整原始碼,
使用該組件
如果該組件對你有所幫助,可以通過 npm 的方式進行安裝:
npm i vue-pinch --save
復制代碼
更多組件
create-picture:該組件提供了 canvas 的圖片繪制與文本繪制功能,使用同步的語法完成異步繪制,簡化原生 canvas 繪制語法,記住:我是08年出道的高級前端老鳥,有問題或者交流經驗可以進我的扣扣裙 519293536 我都會盡力幫大家哦
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/67745.html
標籤:JavaScript
