移動應用滑動屏幕方向判斷解決方案JS判斷手勢方向

問題描述:

滑動屏幕打開相應功能操作。

1、用戶手動滑動屏幕,根據滑動的方向,打開相應的功能(如:向上滑搖錢樹經驗明細,向下滑打開任務明細,向左滑打開聚寶盆物品查看等功能),滑動事件捕獲問題。

2、大家都知道,划動都有角度問題,如:向330度方向滑動手機,要計算出它的方向問題。

3、HTML5提供的滑動事件,只能讀取到起點和終點座標,計算角度問題。

4、手機屏幕座標與標準座標系轉換問題。

解決方案

1、滑動屏幕事件使用HTML5 的touchstart滑動開始事件和touchend滑動結束事件。

2、方向的判斷,以起點做平面座標系,與終點連線做直線,直線與x正半軸計算角度;我們以45度角爲方向分割線,如:只要滑動角度大於等於45度且小於135度,則判斷它方向爲向上滑。

3、使用Math.atan2來計算起點與終點形成的直線角度。

4、仔細對比標準座標系與屏幕座標系,我們發現,標準座標系,上半軸爲負值,要實現轉換,只需要調換Y座標起點與終於位置即可。

處理代碼如下:

[javascript] view plain copy
  1. <script>  
  2.   
  3.           //返回角度  
  4.           function GetSlideAngle(dx, dy) {  
  5.               returnMath.atan2(dy, dx) * 180 / Math.PI;  
  6.           }  
  7.    
  8.           //根據起點和終點返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑動  
  9.           function GetSlideDirection(startX, startY, endX, endY) {  
  10.               var dy = startY - endY;  
  11.               var dx = endX - startX;  
  12.               varresult = 0;  
  13.    
  14.               //如果滑動距離太短  
  15.               if(Math.abs(dx) < 2 && Math.abs(dy) < 2) {  
  16.                   returnresult;  
  17.               }  
  18.    
  19.               varangle = GetSlideAngle(dx, dy);  
  20.               if(angle >= -45 && angle < 45) {  
  21.                   result = 4;  
  22.               }else if (angle >= 45 && angle < 135) {  
  23.                   result = 1;  
  24.               }else if (angle >= -135 && angle < -45) {  
  25.                   result = 2;  
  26.               }  
  27.               else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {  
  28.                   result = 3;  
  29.               }  
  30.    
  31.               returnresult;  
  32.           }  
  33.    
  34.           //滑動處理  
  35.           var startX, startY;  
  36.           document.addEventListener('touchstart',function (ev) {  
  37.               startX = ev.touches[0].pageX;  
  38.               startY = ev.touches[0].pageY;    
  39.           }, false);  
  40.           document.addEventListener('touchend',function (ev) {  
  41.               var endX, endY;  
  42.               endX = ev.changedTouches[0].pageX;  
  43.               endY = ev.changedTouches[0].pageY;  
  44.               var direction = GetSlideDirection(startX, startY, endX, endY);  
  45.               switch(direction) {  
  46.                   case 0:  
  47.                       alert("沒滑動");  
  48.                       break;  
  49.                   case 1:  
  50.                       alert("向上");  
  51.                       break;  
  52.                   case 2:  
  53.                       alert("向下");  
  54.                       break;  
  55.                   case 3:  
  56.                       alert("向左");  
  57.                       alert("!");  
  58.                       break;  
  59.                   case 4:  
  60.                       alert("向右");  
  61.                       break;  
  62.                   default:             
  63.               }  
  64.           }, false);  
  65.      
  66.             
  67.       </script>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章