Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测android设备的方向?_Android_Orientation - Fatal编程技术网

如何检测android设备的方向?

如何检测android设备的方向?,android,orientation,Android,Orientation,在不编程侦听器和处理位置矩阵的情况下,检测android设备的当前方向是否可能简单? 在我的应用程序中,我只想知道当前的方向——垂直或水平。但是,我不想听axiometry事件或其他事件。使用以下方法: 从文件中: 返回屏幕从“自然”方向的旋转。返回的值可以是Surface.ROTATION\u 0(无旋转)、Surface.ROTATION\u 90、Surface.ROTATION\u 180或Surface.ROTATION\u 270。例如,如果一个设备有一个自然高的屏幕,并且用户将其侧

在不编程侦听器和处理位置矩阵的情况下,检测android设备的当前方向是否可能简单? 在我的应用程序中,我只想知道当前的方向——垂直或水平。但是,我不想听axiometry事件或其他事件。

使用以下方法:

从文件中:

返回屏幕从“自然”方向的旋转。返回的值可以是
Surface.ROTATION\u 0
(无旋转)、
Surface.ROTATION\u 90
Surface.ROTATION\u 180
Surface.ROTATION\u 270
。例如,如果一个设备有一个自然高的屏幕,并且用户将其侧转以进入横向方向,则此处返回的值可能是
Surface.ROTATION\u 90
Surface.ROTATION\u 270
,具体取决于其旋转方向。角度是屏幕上绘制图形的旋转,与设备的物理旋转方向相反。例如,如果设备逆时针旋转90度,为了补偿渲染,将顺时针旋转90度,因此此处返回的值将是
Surface.ROTATION\u 90

请记住,
getRotation
是从Android 2.2引入的。如果您的目标是较旧的设备,请使用
getOrientation

您还可以使用:

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

你只需要知道画布的高度和宽度。。。你的表面。。。你的班长。。。等等

也许你可以通过以下方式获得:

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

我认为最安全、最简单的方法是在XML中为活动的某些元素添加标记。例如,在纵向布局中将viewpager的标记设置为“纵向”,并在横向布局中将其设置为“横向”。然后在oncreate中检查该标记,如下所示:

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

这可能与此无关,但如果碰巧您需要知道这一点,因为您希望将设备锁定到其当前方向,则可以在以下两行代码之间切换

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

您可以使用上面的代码生成扩展函数:

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>


如果用户关闭轮换,这是否会影响工作?例如,我已经关闭了旋转,所以我的桌面方向始终是纵向的,但相机应用程序旋转预览,与此配置无关。这在我的手机Galaxy S3上有效,但在我的10英寸平板电脑仿真器(Android 4.3)上无效:getRotation()返回的旋转与实际旋转完全相反(横向-纵向)@Yar可能是您的平板电脑模拟器的起始方向是纵向的,所以此代码给出的结果正好相反。遵循biegleux的答案,我知道这是一个比较老的帖子,但是如果你使用指南针,设备必须知道准确的旋转方向,才能添加或减去正确的值以获得正确的方位,因此你的anwser不是最好的,但仍然有用。这在三星Galaxy S5上不起作用。最好的解决办法是克里斯蒂安的回答。好吧,我不会相信这样的事情。这是什么?它是否在布局中,它的布局参数是什么,谁在什么情况下使用布局。。。对于一个看起来相当受硬件限制的功能来说,有太多的问题用“W”表示。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="LANDSCAPE">0</integer>
    <integer name="PORTRAIT">1</integer>
</resources>

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)
        }