如何检测android设备的方向?

时间:2011-02-25 00:05:11

标签: android orientation

是否可以简单地检测Android设备的当前方向,而无需编写监听器并处理位置矩阵? 在我的应用程序中,我只想知道目前的方向 - 垂直或水平 - 此刻。但是,我不想听取轴测量或其他事件的事件。

7 个答案:

答案 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_90Surface.ROTATION_180Surface.ROTATION_270。例如,如果某个设备的屏幕自然很高,并且用户将其侧面转为横向,则此处返回的值可能是Surface.ROTATION_90Surface.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);