2012-05-19 26 views
3

Im使用OrientationEventListener检测方向,但我有一个问题,那就是平板电脑是横向的,手机是默认的纵向。这意味着OrientationEventListener在平板电脑上返回的值为90,而手机上的肖像为0。OrientationEventListener(Tablet vs Mobile)90度差

我正在使用的活动有相机,因此我无法在方向之间更改,因此我使用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; 
       } 
      } 

回答

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); 
} 

大,XLARGE屏幕尺寸被从它们将被用在眼睛的距离根据 制造商确定(因此 平板电脑的想法)。

希望这会有所帮助!

+0

我希望能够在SDK中忽略一个方法。我不认为走检查设备/型号/产品描述的路线是一个好主意。但是,检查xlarge/large可能会更好。我确信xlarge会覆盖所有的7“+平板电脑,但是大的想法可能最终影响星系联系,三星音符和三星S2和S3。感谢这个想法,生病了吧:) – JonWillis

+0

Configuration.SCREENLAYOUT_SIZE_LARGE和4(作为Configuration.SCREENLAYOUT_SIZE_XLARGE是API9),至少在我的物理测试设备中起作用 – JonWillis

0

当设备方向改变时,您的活动被破坏并重新创建,这意味着您不需要实际“倾听”特定事件。 要知道,如果你是在纵向或横向,不管是什么样的设备的运行代码:

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

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

+0

活动没有被破坏当我在表面视图上使用相机时,我不会从纵向改变为横向,因此onCreate不会被调用但我需要倾听方向感应器并手动重新定位。从技术上讲,我绝不会放弃纵向方向。 – JonWillis

0

其实,我我用了一个可怕的黑客来解决同样的问题(我真的很惭愧:)。当你得到你的传感器方向时,将它与屏幕尺寸比(宽对高)进行比较。

传感器定位==屏幕定位指PHONE,否则为TABLET (或TV,...或任何其他)。 下面是我用来获得屏幕比例/方向的代码(不幸的是,只有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机器人加密狗上。“不要像我一样编码,你会没事的。”

sean

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()的结果之后完成。