デバイスの詳細な向き、できればSCREEN_ORIENTATION_LANDSCAPE
、SCREEN_ORIENTATION_PORTRAIT
、SCREEN_ORIENTATION_REVERSE_LANDSCAPE
、SCREEN_ORIENTATION_REVERSE_PORTRAIT
from ActivityInfo
または同等のもの。
StackOverflowに関するここの答えのいくつかは含まれています
getWindowManager().getDefaultDisplay().getRotation()
しかし、これは実際にデバイスがポートレートモードかランドスケープモードかを判断するのではなく、本来の位置を基準にしてデバイスがどのように回転するかを示します。
getResources().getConfiguration().orientation
次の3つのいずれかを返します:ORIENTATION_LANDSCAPE
、ORIENTATION_PORTRAIT
、ORIENTATION_SQUARE
、それは実際には、電話がどの方向に向けられているか(それが逆さまになっているか、どちらの側に向けられているかにかかわらず)私に教えてくれません。
後者をDisplayMetrics
と組み合わせて使用して、デバイスの自然な向きを調べることができますが、本当に良い方法はありませんか?
私は次のソリューションを使用することになりました:
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;
}
[〜#〜] note [〜#〜]:一部のユーザー(以下のコメントのGeltrudeとholtaf)は、自然な方向からの回転方向としてこのソリューションがすべてのデバイスで機能しないことを指摘しました。標準化されていません。
簡単なアプローチは、使用することです
getResources().getConfiguration().orientation
1は縦向き、2は横向きです。
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;
}
問題は、ランドスケープとポートレートを検出できるが、古いバージョンではサポートされていないため、ランドスケープとリバースプロトレートを逆にできないことだと思います。何ができるかを検出することは、オリエンテーションと回転の両方を使用できることです。私はあなたに役立つかもしれないという考えをあなたに与えています。
これを試してみて、問題を解決できると思います。
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;
}
}
結局、上記のZoltánの回答を使用しましたが、タブレット(Samsung P6210 Galaxy Tab 7.0 Plus)で試してみた場合を除き、これは非常に効果的です。ポートレートモードでは、SCREEN_ORIENTATION_REVERSE_PORTRAITが返されました。したがって、elseステートメント(自然な向きが横向きの場合)でROTATION_90とROTATION_270のケースを交換しましたが、すべて正常に機能しているようです。 (これをゾルタンの回答へのコメントとして投稿するほどの評判はありません。)
あなたは非常に簡単な方法でそれをすることができます:画面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();
}