2015-12-28 48 views
2

我正在使用window.DeviceOrientationEvent來監聽設備方向的更改。但是,我想校準我的應用程序,以將方向更改相對於報告爲原始方向。爲了做到這一點,我已經提出了以下解決方案:在不使用監聽器的情況下獲取設備方向(alpha,beta,gamma)?

originalOrientation.freeze = false; 
window.addEventListener('deviceorientation', function(e){ 
      var orientation = {g: Math.round(e.gamma), b: Math.round(e.beta), a: Math.round(e.alpha), o: window.orientation || 0}; 
      if(!originalOrientation.freeze){ 
       originalOrientation = orientation; 
       originalOrientation.freeze = true; 
      } 
     }); 

這基本上採取由deviceorientation聽衆和「凍結」它,所以它不會不斷更新返回的第一個值。我不喜歡這種方法,因爲我寧願在代碼中的其他地方進行校準,而不是收集實際方向的地方。我也不想連接監聽器兩次,因爲回調中返回的值將會丟失。

TLDR;

有沒有一種方法可以調用像window.getDeviceOrientation()這樣的方式來同步返回alpha,beta和gamma值而不是附加回調?

回答

2

我認爲full-tilt庫會爲你做到這一點。

在github頁面上有一個簡單的例子,顯示瞭如何初始化他們基於promise的庫,然後在你的邏輯中,你只需在調用諸如deviceOrientation.getScreenAdjustedEuler()之類的方法之前檢查設備方向對象是否存在(IE承諾已實現) 。

你不必像他們的例子那樣使用動畫循環。

另外,您可以在不丟失數據的情況下添加和刪除事件偵聽器。我肯定會這樣做,而不是禁止聽者凍結。我需要一段時間添加和刪除偵聽器,以便在需要不斷更新時(或者更準確地說,不需要時訂閱事件)獲取初始狀態,以便稍後與之比較。儘管如此,我仍然會全力以赴。我使用它是因爲它提供了跨設備的規範化數據,但它幾乎完成了你想要的任何操作,並且可能會讓你的代碼更加整潔。

如果5個月後你還在研究它,那麼是的,這對於現在正在尋找的人來說可能更有用。

相關問題