2011-03-04 54 views
1

我使用Display.getRotation()方法來確定我的應用程序在屏幕的當前方向,每本有幫助的博客條目從谷歌:Android:屏幕方向報告太慢?

http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html

概括地說,我有一個繪圖應用程序,允許用戶繪製形狀等到屏幕上,並且繪圖畫布需要保持在相同的方向,但我仍然想要選項菜單等,以便當用戶開始繪製與設備不同方向。

onDraw()對於畫布,我請求從getRotation()的方向,然後將畫布旋轉回「0」位置,以便從最終用戶的角度來看,畫布不會移動。像魅力除了如果用戶快速翻轉設備非常 ...然後getRotation()報告旋轉0,並因此畫布不旋轉回來,使繪圖出現翻轉或轉動。

有趣的是,標題欄和選項菜單翻轉...所以不知道他們從哪裏獲取方向。如果用戶開始繪製,隨後調用onDraw()將獲得正確的旋轉值,並且繪圖返回到正確的位置,但您可以想象它有點令人不安或令人討厭。任何處理這個問題的策略?

謝謝。

+0

我很想看到這個答案。我的應用遇到類似問題。 – 2011-04-26 20:34:36

回答

1

你可以嘗試使用getOrientation()來代替......我不確定你的問題源於哪裏,但是誰知道它可以給你一個不同的結果。

Display myDisplay = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();   
int rotation = myDisplay.getOrientation(); 
switch (rotation) { 
    case Surface.ROTATION_0: { doSomething(); break; } 
    case Surface.ROTATION_90: { doSomething(); break; }     
    case Surface.ROTATION_270: { doSomething(); break; }      
    case Surface.ROTATION_180: { doSomething(); break; } 
} 
+0

壞主意。 'getOrientation'已被棄用。 – EboMike 2011-03-04 22:11:19

0

使用onOrientationChanged()。它以度數返回當前角度。它似乎可靠地用於顯示屏方向更改。我將角度轉換爲4個標準方向,如下所示:

myOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) 
    { 

     @Override 
     public void onOrientationChanged(int iAngle) 
     {       // 0 15 30 45 60 75, 90 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345 
      final int iLookup[] = {0, 0, 0,90,90, 90,90, 90, 90, 180, 180, 180, 180, 180, 180, 270, 270, 270, 270, 270, 270, 0, 0, 0}; // 15-degree increments 
      if (iAngle != ORIENTATION_UNKNOWN) 
      { 
       int iNewOrientation = iLookup[iAngle/15]; 
       if (iOrientation != iNewOrientation) 
       { 
       iOrientation = iNewOrientation; 
       <do something with new orientation> 
       } 
      } 
     } 
    };