4

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

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

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

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

4 回答 4

2

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

看看这个参考

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

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

替代是我在这里找到的,引用答案:

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 屏幕尺寸由制造商根据与眼睛的距离来确定(因此是平板电脑的概念)。

希望这可以帮助!

于 2012-05-19T22:14:54.080 回答
1

还有另一种方法。您可以结合使用当前配置的方向和显示旋转来确定设备的自然方向,如下所述:如何在 Android 上检查设备自然(默认)方向(即获取横向,例如 Motorola Charm 或 Flipout) . 使用那里描述的 getDeviceDefaultOrientation() 方法,您可以按如下方式设置 isTablet 变量:

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

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

于 2015-09-24T22:17:05.013 回答
0

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

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

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

于 2012-05-19T22:19:33.313 回答
0

实际上,我使用了一个糟糕的 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 上找到了它。

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

肖恩

于 2013-09-21T01:06:12.483 回答