Проблема заключается в том, что некоторые устройства являются портретным режимом по умолчанию, а некоторые - по умолчанию. Ось y акселерометра выровнена в направлении «вверх» устройства в его естественном состоянии, которое изменяется от устройства к устройству. На регулярной портрета-по-умолчанию телефон, ось у выравнивается по длинной стороне экрана:
+------+
| | ^
| | y|
| | |
| | |
| | +---->
| | x
+------+
Но на таблетки, или широкий телефон, который является пейзаж по умолчанию, ось у совмещен на самую короткую сторону экрана.
+--------------+
| | ^
| | 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.
Я использовал DisplayMetrics displayMetrics = new DisplayMetrics(); this.getWindowManager(). GetDefaultDisplay(). GetMetrics (displayMetrics); Дисплей display = getWindowManager(). GetDefaultDisplay(); int portrait = display.getRotation(); if (портрет == Surface.ROTATION_90 || портрет == Surface.ROTATION_270) {// landscape} else {-portrait-} – JohnRaja