2011-12-23 49 views
1

我正在開發使用加速度計(Andengine)的遊戲。如何使所有Android設備使用加速度計相同的構建

示例代碼:在HTC G1設備

this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
    final Engine engine = new Engine(new EngineOptions(true,ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), this.mCamera).setNeedsSound(true)); 

if(pAccelerometerData.getX()<-1) 
// Move ball in upwards direction 

else if (pAccelerometerData.getX()>1) 
// Move ball in dowards direction 

其工作正常(480)。但是當我試圖在三星b7510(320x240)和銀河平板電腦上運行時,我需要在相反方向旋轉溫度計。對於我所提出的問題

if(pAccelerometerData.getY()<-1) 
// Move ball in upwards direction 

else if (pAccelerometerData.getY()>1) 
// Move ball in dowards direction 

如何使用加速度計對所有設備進行相同的構建?

回答

1

這裏的問題是,有些設備默認是縱向模式,有些設備默認是橫向模式。加速度計的y軸與設備處於自然狀態的「向上」方向對齊,每個設備之間都會發生變化。定期肖像被默認的手機,y軸對準屏幕的最長邊:

+------+ 
|  | ^
|  | y| 
|  | | 
|  | | 
|  | +----> 
|  |  x 
+------+ 

但在平板電腦上,或寬的手機,是景觀默認情況下,y軸對準到屏幕的最短邊。

+--------------+ 
|    | ^
|    | y| 
|    | | 
+--------------+ +-------> 
          x 

解決的辦法是檢查android.view.Display.getRotation()。在一個默認方向的肖像設備上(即像第一個ASCII藝術圖),這將返回ROTATION_0。在一臺風景設備上轉過來,屏幕最長的部分向上,它將返回ROTATION_90(或ROTATION_270)。

同樣,如果你強迫你的遊戲要在橫向模式下與在AndroidManifest.xml android:screenOrientation="landscape"或通過ScreenOrientation.LANDSCAPE在你的片段,然後肖像手機將返回ROTATION_90和景觀設備ROTATION_0

在強制景觀遊戲的情況下,你需要像這樣:

WindowManager wm = (WindowManager) context.getSystemService(
            Context.WINDOW_SERVICE); 
boolean portrait = wm.getDefaultDisplay().getRotation() == Surface.ROTATION_90; 
// ... 
float dy; 
if (portrait) { 
    dy = pAccelerometerData.getX(); 
} else { 
    dy = pAccelerometerData.getY(); 
} 
if (dy < -1) { 
    // move ball up 
} else if (dy > 1) { 
    // move ball down 
} 

這僅適用於Android 2.2及更高版本。早期的設備都是肖像,並且getRotation()方法不存在,所以如果您想要支持沒有Froyo的設備,則必須使用反射或類似技術。

+0

我使用了DisplayMetrics displayMetrics = new DisplayMetrics(); this.getWindowManager()。getDefaultDisplay()。getMetrics(displayMetrics); Display display = getWindowManager()。getDefaultDisplay(); int portrait = display.getRotation();如果(縱向== Surface.ROTATION_90 ||縱向== Surface.ROTATION_270){//橫向} else {-portrait-} – JohnRaja 2011-12-27 11:31:52

相關問題