Jak uzyskać bieżącą orientację (ActivityInfo.Orientacja ekranu*) urządzenia z systemem Android?
Chciałbym poznać szczegółową orientację urządzenia, najlepiej jednego z SCREEN_ORIENTATION_LANDSCAPE
, SCREEN_ORIENTATION_PORTRAIT
, SCREEN_ORIENTATION_REVERSE_LANDSCAPE
, SCREEN_ORIENTATION_REVERSE_PORTRAIT
od ActivityInfo
lub równoważne.
Niektóre z odpowiedzi tutaj na StackOverflow zawarte
getWindowManager().getDefaultDisplay().getRotation()
Ale to nie mówi mi, czy urządzenie jest w trybie pionowym czy poziomym, tylko jak jest obracane w odniesieniu do jego naturalnego położenia - które z kolei może być w pierwszej kolejności poziome lub pionowe.
getResources().getConfiguration().orientation
Zwraca jedną z następujących trzech: ORIENTATION_LANDSCAPE
, ORIENTATION_PORTRAIT
, ORIENTATION_SQUARE
, co wtedy tak naprawdę nie mówi mi, w którą stronę telefon jest obrócony(czy jest do góry nogami, czy na które z boków jest obrócony).
Wiem, że mógłbym użyć tego drugiego w połączeniu z DisplayMetrics
, aby dowiedzieć się, jaka jest naturalna orientacja urządzenia, ale czy naprawdę nie ma lepszego sposobu?
8 answers
Skończyło się na użyciu następującego rozwiązania:
private int getScreenOrientation() {
int rotation = getWindowManager().getDefaultDisplay().getRotation();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
int orientation;
// if the device's 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(TAG, "Unknown screen orientation. Defaulting to " +
"portrait.");
orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
break;
}
}
// if the device's 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(TAG, "Unknown screen orientation. Defaulting to " +
"landscape.");
orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
break;
}
}
return orientation;
}
Uwaga : niektórzy użytkownicy (Geltrude i holtaf w komentarzach poniżej) zwrócili uwagę, że to rozwiązanie nie będzie działać na wszystkich urządzeniach, ponieważ kierunek obrotu od naturalnej orientacji nie jest znormalizowany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 07:26:18
Prostym podejściem byłoby użycie
getResources().getConfiguration().orientation
1 to Potrait i 2 to Landscape.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-01 20:35:13
public static int getScreenOrientation(Activity activity) {
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int orientation = activity.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) {
return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
} else {
return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
}
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) {
return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
}
return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-25 15:29:56
getResources().getConfiguration().orientation
jest standardowym sposobem poznania bieżącej orientacji. Jeśli jednak nie spełnia Twoich potrzeb, być może możesz użyć czujników, aby obliczyć go pod kątem. Przeczytaj to i to
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-30 09:10:42
Myślę, że twój problem polega na tym, że możesz wykrywać krajobraz i portret, ale nie odwracać krajobrazu i odwracać protrait, ponieważ nie są one obsługiwane w starszych wersjach. Aby wykryć, co możesz zrobić, możesz użyć zarówno oreintation, jak i rotation. Daję ci pomysł, że może Ci się przydać.
Spróbuj tego, myślę, że to może rozwiązać twój problem.
int orientation = getResources().getConfiguration().orientation;
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int actual_orientation = -1;
if (orientation == Configuration.ORIENTATION_LANDSCAPE
&& (rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_90)){
orientation = Configuration.ORIENTATION_LANDSCAPE;
} else if (orientation == Configuration.ORIENTATION_PORTRAIT
&& (rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_90)) {
orientation = Configuration.ORIENTATION_PORTRAIT;
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE
&& (rotation == Surface.ROTATION_180
|| rotation == Surface.ROTATION_270)){
orientation = //any constant for reverse landscape orientation;
} else {
if (orientation == Configuration.ORIENTATION_PORTRAIT
&& (rotation == Surface.ROTATION_180
|| rotation == Surface.ROTATION_270)){
orientation = //any constant for reverse portrait orientation;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-30 09:47:48
Skończyło się na użyciu odpowiedź Zoltán powyżej, który działa świetnie, z wyjątkiem, gdy próbowałem go na tablecie (Samsung P6210 Galaxy Tab 7.0 Plus). W trybie portretowym zwraca SCREEN_ ORIENTATION_REVERSE_PORTRAIT. Tak więc w stwierdzeniu else (jeśli naturalna orientacja jest krajobrazowa) zamieniłem przypadki na rotację FORMULA_90 i rotację FORMULA_270 i wszystko wydaje się działać dobrze. (Nie mam dość reputacji, aby to zamieścić jako komentarz do odpowiedzi Zoltána.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-17 17:45:29
Można to zrobić w bardzo prosty sposób:
Pobierz ekran widht
i height
.
szerokość ekranu będzie zawsze wyższa, gdy urządzenie jest w orientacji poziomej.
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Toast.makeText(getApplicationContext(), "" + width + "," + height,
Toast.LENGTH_SHORT).show();
if (width > height) {
Toast.makeText(getApplicationContext(), "LandScape",
Toast.LENGTH_SHORT).show();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-13 10:29:10
Czy to rozwiązuje twój problem?
public static int getscrOrientation(Activity act)
{
Display getOrient = act.getWindowManager()
.getDefaultDisplay();
int orientation = getOrient.getOrientation();
// Sometimes you may get undefined orientation Value is 0
// simple logic solves the problem compare the screen
// X,Y Co-ordinates and determine the Orientation in such cases
if (orientation == Configuration.ORIENTATION_UNDEFINED) {
Configuration config = act.getResources().getConfiguration();
orientation = config.orientation;
if (orientation == Configuration.ORIENTATION_UNDEFINED) {
// if height and widht of screen are equal then
// it is square orientation
if (getOrient.getWidth() == getOrient.getHeight()) {
orientation = Configuration.ORIENTATION_SQUARE;
} else { // if widht is less than height than it is portrait
if (getOrient.getWidth() < getOrient.getHeight()) {
orientation = Configuration.ORIENTATION_PORTRAIT;
} else { // if it is not any of the above it will defineitly
// be landscape
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
}
}
return orientation; // return value 1 is portrait and 2 is Landscape
// Mode
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-30 09:13:26