【问题标题】:how to detect orientation of android device?如何检测android设备的方向?
【发布时间】:2011-02-25 00:05:11
【问题描述】:

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

【问题讨论】:

    标签: android orientation


    【解决方案1】:

    你也可以使用:

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

    【讨论】:

    • 我知道这是一个较旧的帖子,但如果使用指南针,设备必须知道确切的旋转以添加或减去正确的值以获得正确的方位,所以你的anwser 不是最好的,但仍然有用。
    • 这不适用于三星 Galaxy S5。最佳解决方案是克里斯蒂安的回答。
    【解决方案2】:

    使用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

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

    【讨论】:

    • 如果用户关闭旋转,它是否有效?例如我关闭了旋转,所以我的桌面方向总是纵向的,但是相机应用程序,旋转预览独立于这个配置。
    • 这适用于我的手机 - Galaxy S3,但不适用于搭载 Android 4.3 的 10 英寸平板电脑模拟器:getRotation() 返回的旋转与实际旋转完全相反(横向 - 纵向)!
    • @Yar 可能是您的平板电脑模拟器的起始方向是纵向的,因此此代码会为您提供完全相反的结果。请改用 biegleux 的回答
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您只需要知道画布的高度和宽度...您的表面...您的显示器...等等。

      也许你可以得到它:

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

      【讨论】:

      • 好吧,我不会依赖这样的东西。这是什么canvas?它在布局中吗?它的布局参数是什么?谁在什么情况下使用布局......对于一个看起来非常受硬件约束的功能,“W”的问题太多了。
      【解决方案5】:

      你可以用上面的代码做一个扩展函数:

      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】:

        这可能无关紧要,但如果您偶然需要知道这一点,因为您想将设备锁定到其当前方向,您可以在以下两行代码之间切换。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-29
          相关资源
          最近更新 更多