我想了解设备的详细方向,最好是来自SCREEN_ORIENTATION_LANDSCAPE
的{{1}},SCREEN_ORIENTATION_PORTRAIT
,SCREEN_ORIENTATION_REVERSE_LANDSCAPE
,SCREEN_ORIENTATION_REVERSE_PORTRAIT
或同等设备之一
StackOverflow上的一些答案包括
ActivityInfo
但这并没有真正告诉我这个设备是处于纵向还是横向模式,只是它是如何根据其自然位置进行转动的 - 这反过来可以是风景或肖像。
getWindowManager().getDefaultDisplay().getRotation()
返回以下三种中的一种:getResources().getConfiguration().orientation
,ORIENTATION_LANDSCAPE
,ORIENTATION_PORTRAIT
,然后它并没有真正告诉我手机的转向方式(无论是颠倒还是哪个它转向的两侧。)
我知道我可以结合ORIENTATION_SQUARE
使用后者来找出设备的自然方向,但是真的没有更好的方法吗?
答案 0 :(得分:89)
我最终使用了以下解决方案:
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;
}
注意:有些用户(下面评论中的Geltrude和holtaf)指出,此解决方案不适用于所有设备,因为自然方向的旋转方向未标准化。
答案 1 :(得分:20)
简单的方法是使用
getResources().getConfiguration().orientation
1表示纵向,2表示横向。
答案 2 :(得分:15)
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;
}
答案 3 :(得分:7)
getResources().getConfiguration().orientation
是了解当前使用方向的标准方式。但是,如果它不能满足您的需求,那么也许您可以使用传感器以角度计算它。阅读this和this
答案 4 :(得分:7)
我认为您的问题是您可以检测横向和纵向,但不能反转横向和反转版本,因为旧版本不支持它们。要检测你可以做的是你可以使用oreintation和rotation。我想你可能对你有用。
尝试这个我认为它可以解决你的问题。
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;
}
}
答案 5 :(得分:2)
我最终使用Zoltán上面的答案,除非我在平板电脑(三星P6210 Galaxy Tab 7.0 Plus)上试用它,否则效果很好。在纵向模式下,它返回SCREEN_ORIENTATION_REVERSE_PORTRAIT。所以在else语句中(如果自然方向是横向)我交换了ROTATION_90和ROTATION_270的情况,一切似乎都运行正常。 (我没有足够的声誉将此作为对Zoltán答案的评论发布。)
答案 6 :(得分:1)
你可以用一种非常简单的方式做到这一点:
获取屏幕widht
和height
。
当设备处于横向时,屏幕宽度将始终更高。
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();
}
答案 7 :(得分:-1)
这会解决您的问题吗?
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
}