如何使用Accelerometer为所有Android设备制作相同的版本

时间:2011-12-23 05:24:00

标签: android andengine

我正在使用Accelerometer(Andengine)开发游戏。

示例代码:

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

它在HTC g1设备(320x480)中正常工作。但是当我试图在三星b7510(320x240)和galaxy平板电脑上运行时,我需要反向旋转acclometer。对于那个问题我做了

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

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

如何使用Accelerometer为所有设备制作相同的版本?

1 个答案:

答案 0 :(得分: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的设备,则必须使用反射或类似技术。