Проблема здесь в том, что некоторые устройства по умолчанию работают в портретном режиме, а некоторые - по умолчанию.Ось у акселерометра совмещена с направлением «вверх» устройства в его естественном состоянии, которое изменяется от устройства к устройству.На обычном телефоне с портретной ориентацией по умолчанию ось 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.