【发布时间】:2011-02-25 00:05:11
【问题描述】:
是否可以简单地检测 android 设备的当前方向,而无需编写侦听器并处理位置矩阵? 在我的应用程序中,我只想知道当前的方向 - 垂直或水平 - 目前。但是我不想听公理事件或其他事件。
【问题讨论】:
标签: android orientation
是否可以简单地检测 android 设备的当前方向,而无需编写侦听器并处理位置矩阵? 在我的应用程序中,我只想知道当前的方向 - 垂直或水平 - 目前。但是我不想听公理事件或其他事件。
【问题讨论】:
标签: android orientation
你也可以使用:
getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE
【讨论】:
使用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。
【讨论】:
我认为最安全和最简单的方法是在 XML 中为您的活动的某些元素添加标签。例如,在纵向布局中将 viewpager 的标签设置为“纵向”,在横向布局中将其设置为“横向”。然后在您的 oncreate 中检查该标签,如下所示:
if(mViewpager.getTag().equals("portrait"))
// is in portrait
else
// is in landscape
【讨论】:
您只需要知道画布的高度和宽度...您的表面...您的显示器...等等。
也许你可以得到它:
if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}
【讨论】:
canvas?它在布局中吗?它的布局参数是什么?谁在什么情况下使用布局......对于一个看起来非常受硬件约束的功能,“W”的问题太多了。
你可以用上面的代码做一个扩展函数:
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)
}
【讨论】:
这可能无关紧要,但如果您偶然需要知道这一点,因为您想将设备锁定到其当前方向,您可以在以下两行代码之间切换。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
【讨论】: