Androidデバイスの現在の向きを、リスナーをプログラミングし、位置マトリックスを処理せずに簡単に検出することは可能ですか?私のアプリでは、現時点では現在の向き(垂直または水平)のみを知りたいです。ただし、アキシオメトリーのイベントやその他のイベントを聞きたくありません。
getRotation
メソッドを使用します。
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
ドキュメントから:
「自然な」方向からの画面の回転を返します。返される値は
Surface.ROTATION_0
(回転なし)、Surface.ROTATION_90
、Surface.ROTATION_180
、またはSurface.ROTATION_270
。たとえば、デバイスの画面が自然に高く、ユーザーが横向きにして横向きにした場合、ここで返される値はSurface.ROTATION_90
またはSurface.ROTATION_270
回転方向に応じて。角度は、画面上に描画されたグラフィックスの回転であり、デバイスの物理的な回転の反対方向です。たとえば、デバイスを反時計回りに90度回転させると、レンダリングを補正するために時計回りに90度回転するため、ここで返される値はSurface.ROTATION_90
。
getRotation
はAndroid 2.2から導入されました。ターゲットが古いデバイスの場合はgetOrientation
を使用してください。
以下も使用できます。
getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE
このテーマについては必読の素敵な記事があります: 1つの画面を回すのは当然です
キャンバスの高さと幅、表面、モニターなどを知るだけです。
多分あなたはそれを手に入れることができます:
if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}
上記のコードから拡張機能を作成できます。
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)
}
最も安全で簡単な方法は、XMLでアクティビティの要素にタグを追加することだと思います。たとえば、縦長のレイアウトではビューページャーのタグを「portrait」に設定し、横長では「landscape」に設定します。次に、そのタグのoncreateチェックで次のようにします。
if(mViewpager.getTag().equals("portrait"))
// is in portrait
else
// is in landscape
これは関係ないかもしれませんが、デバイスを現在の向きにロックするために偶然にこれを知る必要がある場合は、次の2行のコードを切り替えることができます。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);