Как сделать одинаковую сборку для всех устройств Android с помощью акселерометра - PullRequest
1 голос
/ 23 декабря 2011

Я занимаюсь разработкой игры с использованием акселерометра (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). Но когда я пытаюсь работать в Samsung B7510 (320x240) и планшете Galaxy, мне нужно повернуть аклометр в обратном направлении. Для этой проблемы я сделал

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

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

Как сделать одинаковую сборку для всех устройств с помощью акселерометра?

1 Ответ

1 голос
/ 23 декабря 2011

Проблема здесь в том, что некоторые устройства по умолчанию работают в портретном режиме, а некоторые - по умолчанию.Ось у акселерометра совмещена с направлением «вверх» устройства в его естественном состоянии, которое изменяется от устройства к устройству.На обычном телефоне с портретной ориентацией по умолчанию ось Y выравнивается по самой длинной стороне экрана:

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

Но на планшете или широкоформатном телефоне с горизонтальной ориентацией по умолчанию ось Yвыровнен по самой короткой стороне экрана.

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

Решение состоит в том, чтобы проверить android.view.Display.getRotation () .На портретном устройстве, которое имеет ориентацию по умолчанию (то есть, как первая диаграмма ASCII), это вернет ROTATION_0.На устройстве с альбомной ориентацией, повернутом таким образом, что самая длинная часть экрана направлена ​​вверх, оно вернется ROTATION_90 (или ROTATION_270).

Аналогично, если вы заставите свою игру перейти в альбомный режим с помощью android:screenOrientation="landscape" в AndroidManifest.xml или через 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.

...