HTML5本身並不直接提供“手勢檢測”這一高階API。它提供的是更底層的觸控事件 (Touch Events),開發者需要基於這些底層事件自行實現手勢識別。 手勢,例如縮放(pinch)、旋轉(rotate)、滑動(swipe)等,都是由一系列連續的觸控事件組成的。
HTML5觸控事件主要包括:
- touchstart: 手指觸控螢幕時觸發。
- touchmove: 手指在螢幕上移動時觸發。
- touchend: 手指離開螢幕時觸發。
- touchcancel: 觸控被中斷時觸發(例如,來電)。
要實現手勢檢測,通常需要監聽這些事件,並記錄觸控點的位置、時間、數量等資訊,然後根據這些資訊進行計算和判斷。
以下是實現手勢檢測的一般思路:
-
監聽觸控事件: 使用
addEventListener
監聽上述觸控事件。 -
記錄觸控點資料: 在事件回撥函式中,透過
event.touches
獲取當前所有觸控點的資訊,包括每個觸控點的clientX
、clientY
(座標)、identifier
(唯一識別符號) 等。 -
分析觸控點資料: 根據不同的手勢,需要分析不同的資料。例如:
- 縮放 (Pinch): 需要記錄兩個觸控點之間的距離變化。 可以使用兩點間的距離公式 $\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$ 計算。
- 旋轉 (Rotate): 需要記錄兩個觸控點與中心點連線的角度變化。 可以使用反正切函式
atan2(y, x)
計算角度。 - 滑動 (Swipe): 需要記錄單個觸控點的位移和速度。
-
判斷手勢: 根據分析結果,判斷是否觸發了特定手勢。例如,如果兩個觸控點之間的距離增加,則判斷為放大;如果距離減小,則判斷為縮小。
-
執行相應操作: 根據檢測到的手勢,執行相應的操作。
示例:簡單的雙指縮放檢測
let initialDistance = null;
element.addEventListener('touchstart', function(event) {
if (event.touches.length === 2) {
initialDistance = Math.hypot(event.touches[1].clientX - event.touches[0].clientX, event.touches[1].clientY - event.touches[0].clientY);
}
});
element.addEventListener('touchmove', function(event) {
if (event.touches.length === 2 && initialDistance) {
const currentDistance = Math.hypot(event.touches[1].clientX - event.touches[0].clientX, event.touches[1].clientY - event.touches[0].clientY);
const scale = currentDistance / initialDistance;
// 執行縮放操作,例如改變元素的大小
element.style.transform = `scale(${scale})`;
}
});
element.addEventListener('touchend', function(event) {
initialDistance = null;
});
使用第三方庫: 為了簡化開發,可以使用一些專門用於處理手勢的第三方庫,例如 Hammer.js、AlloyFinger 等。這些庫封裝了底層的觸控事件,提供了更高階的手勢識別API。
總而言之,HTML5沒有直接提供手勢檢測API,開發者需要利用觸控事件自行實現或使用第三方庫。 透過分析觸控事件的資料,可以識別各種複雜的手勢。