Этот вопрос задан до здесь, но его ответ неверен. Я хотел бы повернуть некоторые взгляды на изменение ориентации экрана, но я хочу сохранить макет без изменений. Они должны вращаться на 90, 180, 270 или 360 градусов в соответствии с текущей ориентацией (SCREEN_ORIENTATION_LANDSCAPE
, SCREEN_ORIENTATION_PORTRAIT
, SCREEN_ORIENTATION_REVERSE_LANDSCAPE
, SCREEN_ORIENTATION_REVERSE_PORTRAIT
).
Этого я хочу достичь:
В ответной ссылке я упомянул, что я должен создать новый разный макет в layout-land
. Ясно, что это не то, что я хочу. Я не хочу воссоздавать активность или менять ориентацию макета. Я просто хочу повернуть некоторые виды и не менять другие представления при изменении ориентации.
Существует огромное различие между вращением определенных видов и изменением или воссозданием всей компоновки (как при изменении ориентации).
Используя ответ в этой ссылке, я смогу получить текущую ориентацию экрана с помощью этого метода:
public static int getScreenOrientation(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
int rotation = windowManager.getDefaultDisplay().getRotation();
DisplayMetrics dm = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
int orientation;
// if the device natural orientation is portrait:
if ((rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_180) && height > width ||
(rotation == Surface.ROTATION_90
|| rotation == Surface.ROTATION_270) && width > height) {
switch (rotation) {
case Surface.ROTATION_0:
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
case Surface.ROTATION_90:
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
break;
case Surface.ROTATION_180:
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
break;
case Surface.ROTATION_270:
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
default:
Log.e("ScreenOrientation", "Unknown screen orientation. Defaulting to " + "portrait.");
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
}
}
// if the device natural orientation is landscape or if the device
// is square:
else {
switch (rotation) {
case Surface.ROTATION_0:
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
break;
case Surface.ROTATION_90:
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
case Surface.ROTATION_180:
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
break;
case Surface.ROTATION_270:
orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
break;
default:
Log.e("ScreenOrientation", "Unknown screen orientation. Defaulting to " + "landscape.");
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
break;
}
}
return orientation;
}
При изменении ориентации я хотел бы сделать что-то простое:
RotateAnimation rotateAnimation = new RotateAnimation(0, getScreenOrientation(getContext()));
rotateAnimation.setDuration(2000);
for (int i = 0; i < 63; i++) {
Button button = (Button) rootView.findViewById(i);
button.startAnimation(rotateAnimation);
}
Другой способ перефразировать мой вопрос: "Есть ли способ обнаружить изменение ориентации в методе onConfigurationChanged()
без изменения макета?". Проблема в том, что он не сможет обнаружить изменения ориентации, если я уже отключу изменение ориентации макета.
Кто-нибудь знает, как это делается? Я мог бы полностью пройти через неправильные шаги, и я думаю, что мне нужно будет использовать Accelerometer Sensor или что-то похожее на это, чтобы достичь того, что я хочу, поэтому, пожалуйста, помогите мне.