【问题标题】:OrientationEventListener (Tablet vs Mobile) 90 degree differenceOrientationEventListener (Tablet vs Mobile) 90度差异
【发布时间】:2012-05-26 23:54:06
【问题描述】:

我使用 OrientationEventListener 来检测方向,但我有一个问题,平板电脑是横向的,而手机默认是纵向的。这意味着 OrientationEventListener 为平板电脑上的肖像返回值 90,而在手机上为肖像返回 0。

我正在使用的活动有摄像头,因此我无法在方向之间更改,因此我使用 Orientation 的值根据需要重新定位屏幕上的几个元素。

是否可以检测设备是否是平板电脑,以便我可以相应地调整值。即如何计算 isTablet 的值?

            if(isTablet)
            {
                orientation += -90;
                if(orientation < 0) //Check if we have gone too far back, keep the result between 0-360
                {
                    orientation += 360;
                }   
            }

【问题讨论】:

    标签: android mobile screen orientation tablet


    【解决方案1】:

    由于您提到无法在方向之间更改,您必须使用设备的属性来确定它是否是平板电脑。

    看看this reference

    您可以使用android.os.Build.DEVICEandroid.os.Build.MODELandroid.os.Build.PRODUCT 来获取设备的身份,并且根据这些知识,您可以使用this 参考来查找它们的值并确定设备类型。

    但是使用这种方法,您必须在每次发布新平板电脑时更新软件。 (我使用this问题作为这部分答案的参考)。

    替代方案是我发现here,引用答案:

    public boolean isTablet(Context context) {
        boolean xlarge = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
        boolean large = ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
        return (xlarge || large);
    }
    

    LARGE 和 XLARGE 屏幕尺寸由制造商确定 在与眼睛的距离上,它们将被用于(因此 平板电脑)。

    希望这会有所帮助!

    【讨论】:

    • 我希望有一种我在 SDK 中忽略的方法。我不认为检查设备/型号/产品描述的路线是一个好主意。但是,检查 xlarge/large 可能会更好。我确信 xlarge 将涵盖所有 7"+ 平板电脑,但我认为 large 可能最终会影响 Galaxy nexus、三星 Note 以及三星 S2 和 S3。谢谢你的想法,我试试看
    • Configuration.SCREENLAYOUT_SIZE_LARGE 和 4(因为 Configuration.SCREENLAYOUT_SIZE_XLARGE 是 API9),很有魅力。至少在我这里的物理测试设备上。
    【解决方案2】:

    还有另一种方法。您可以结合使用当前配置的方向和显示旋转来确定设备的自然方向,如下所述:How to check device natural (default) orientation on Android (i.e. get landscape for e.g., Motorola Charm or Flipout)。使用那里描述的 getDeviceDefaultOrientation() 方法,您可以按如下方式设置 isTablet 变量:

    isTablet = (getDeviceDefaultOrientation() == Configuration.ORIENTATION_LANDSCAPE)

    如果您的应用有时会强制配置为纵向或横向模式,您可能希望在应用生命周期的早期(强制配置方向之前)调用 getDeviceDefaultOrientation() 并存储该值以供以后使用。否则,您可能会处于设备的物理旋转与配置方向不同步的状态,当视频被强制进入横向模式以进行全屏观看而设备本身仍然具有纵向旋转时,通常会发生这种情况。这可以通过在运行时调用 Activity.setRequestedOrientation() 来完成,之后存储 getDeviceDefaultOrientation() 的结果。

    【讨论】:

      【解决方案3】:

      当设备方向发生变化时,您的活动将被销毁并重新创建,这意味着您不需要实际“监听”特定事件。 要知道您是纵向还是横向,无论哪种设备正在运行您的代码:

      switch (yourContext.getResources().getConfiguration().orientation) {
          case Configuration.ORIENTATION_LANDSCAPE:
              //xxx
              break;
          case Configuration.ORIENTATION_PORTRAIT:
              //xxx
              break;
      }
      

      “onCreate”可能是一个很好的位置 =)

      【讨论】:

      • 活动没有被销毁。当我在表面视图上使用相机时,我不会从纵向变为横向。因此 onCreate 不会每次都被调用。相反,我需要听方向传感器并手动重新定位。从技术上讲,我从不离开纵向。
      【解决方案4】:

      实际上,我使用了一个糟糕的 hack 来解决同样的问题(我真的很惭愧 :)。当您获得传感器方向时,将其与屏幕尺寸比(宽与高)进行比较。

      传感器方向 == 屏幕方向表示手机,否则平板电脑 (或电视,......或任何即将到来的东西)。 这是我用来获取屏幕比例/方向的代码(不幸的是,只有 2 种模式是可识别的)。

      int getScreenOrientation(Activity ctx)  {
        Point pt = new Point(0,0);
        try {
          Display dsp =  ctx.getWindowManager().getDefaultDisplay();
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
            dsp.getSize(pt);
          } else {
            pt.x = dsp.getWidth();   
            pt.y = dsp.getHeight();
          }
        return  (pt.x <= pt.y) ?  
          ActivityInfo.SCREEN_ORIENTATION_PORTRAIT :
          ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        }
        catch (Exception e) {}
        return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
      }
      

      这仅解决了方向问题,它不会检测它是否是平板电脑。事实上,我的大多数 7 英寸标签都没有方向不匹配的问题。我只在我的 NEXUS 10 和 TV android dongle 上找到了它。

      “不要像我一样编码,你会没事的。”

      肖恩

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        • 2019-02-15
        • 2020-07-29
        • 2021-10-12
        • 2021-12-31
        相关资源
        最近更新 更多