web-dev-qa-db-ja.com

Androidデバイスの向きを検出する方法?

Androidデバイスの現在の向きを、リスナーをプログラミングし、位置マトリックスを処理せずに簡単に検出することは可能ですか?私のアプリでは、現時点では現在の向き(垂直または水平)のみを知りたいです。ただし、アキシオメトリーのイベントやその他のイベントを聞きたくありません。

47
Mark

getRotation メソッドを使用します。

Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();

ドキュメントから:

「自然な」方向からの画面の回転を返します。返される値はSurface.ROTATION_0(回転なし)、Surface.ROTATION_90Surface.ROTATION_180、またはSurface.ROTATION_270。たとえば、デバイスの画面が自然に高く、ユーザーが横向きにして横向きにした場合、ここで返される値はSurface.ROTATION_90またはSurface.ROTATION_270回転方向に応じて。角度は、画面上に描画されたグラフィックスの回転であり、デバイスの物理的な回転の反対方向です。たとえば、デバイスを反時計回りに90度回転させると、レンダリングを補正するために時計回りに90度回転するため、ここで返される値はSurface.ROTATION_90

getRotationはAndroid 2.2から導入されました。ターゲットが古いデバイスの場合はgetOrientationを使用してください。

65
Cristian

以下も使用できます。

getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE

このテーマについては必読の素敵な記事があります: 1つの画面を回すのは当然です

7
FerranB

キャンバスの高さと幅、表面、モニターなどを知るだけです。

多分あなたはそれを手に入れることができます:

if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}
1
ORParga

上記のコードから拡張機能を作成できます。

fun AppCompatActivity.getRotation(): Int{
    val display = (baseContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
    val rotation = display.rotation
    when(rotation){
        Surface.ROTATION_90 -> return R.integer.LANDSCAPE
        Surface.ROTATION_270 -> return R.integer.LANDSCAPE
        Surface.ROTATION_180 -> return R.integer.PORTRAIT
        Surface.ROTATION_0 -> return R.integer.PORTRAIT
        else ->
            return R.integer.PORTRAIT
    }
}

リソースディレクトリで、次の内容のconstants.xmlファイルを作成します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="LANDSCAPE">0</integer>
    <integer name="PORTRAIT">1</integer>
</resources>

コーディングは簡単です(例:FragmentのRecyclerviewの垂直/水平レイアウト:

val a  = activity as AppCompatActivity
        val orientation = a.getRotation()
        when (orientation){
            R.integer.PORTRAIT -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL,false)
            R.integer.LANDSCAPE -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL,false)
        }
1
Jens Buysse

最も安全で簡単な方法は、XMLでアクティビティの要素にタグを追加することだと思います。たとえば、縦長のレイアウトではビューページャーのタグを「portrait」に設定し、横長では「landscape」に設定します。次に、そのタグのoncreateチェックで次のようにします。

if(mViewpager.getTag().equals("portrait"))
  // is in portrait
else
  // is in landscape
1
9patchcoder

これは関係ないかもしれませんが、デバイスを現在の向きにロックするために偶然にこれを知る必要がある場合は、次の2行のコードを切り替えることができます。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
0
user2288580