OrientationEventListener(Tablet vs Mobile)90度差异

时间:2012-05-19 21:37:51

标签: android mobile screen orientation tablet

我使用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;
                }   
            }

4 个答案:

答案 0 :(得分:2)

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

看看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屏幕尺寸由制造商决定   在他们将要使用的距离(因此的想法)   平板电脑)。

希望这有帮助!

答案 1 :(得分:1)

还有另一种方法。您可以结合使用当前配置方向和显示旋转来确定设备的自然方向,如下所述: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()的结果。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

来自传感器的方向==屏幕上的方向意味着电话,否则平板电脑 (或电视,......或其他任何东西)。 这是我用来获取屏幕比率/方向的代码(不幸的是只有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和一个电视安卓加密狗上找到它。

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

肖恩