是否可以简单地检测Android设备的当前方向,而无需编写监听器并处理位置矩阵? 在我的应用程序中,我只想知道目前的方向 - 垂直或水平 - 此刻。但是,我不想听取轴测量或其他事件的事件。
答案 0 :(得分:65)
您也可以使用:
getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE
答案 1 :(得分:64)
使用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
。
请注意,从Android 2.2引入了getRotation
。如果您的目标是旧设备,请使用getOrientation
。
答案 2 :(得分:7)
有一篇关于这个主题的好文章是必须阅读的:One Screen Turn Deserves Another
答案 3 :(得分:1)
您只需知道画布的高度和宽度......您的表面......您的显示器......等等。
也许你可以得到它:
if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}
答案 4 :(得分:1)
我认为最安全,最简单的方法是在XML中为活动的某些元素添加标记。例如,在纵向布局中将viewpager的标记设置为“纵向”,并将其设置为横向“横向”。然后在你的oncreate检查那个标签,如:
{{1}}
答案 5 :(得分:1)
您可以通过上面的代码创建扩展功能:
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>
然后,您编写代码就变得很容易(例如,片段中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)
}
答案 6 :(得分:0)
这可能不相关,但如果您想要将设备锁定在其当前方向,您可能需要知道这一点,您可以在以下两行代码之间切换。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);