Android DirectionEventListener(平板电脑与手机)相差90度

Android DirectionEventListener(平板电脑与手机)相差90度,android,mobile,screen,orientation,tablet,Android,Mobile,Screen,Orientation,Tablet,我正在使用OrientationEventListener来检测方向,但我有一个问题,平板电脑是横向的,手机默认是纵向的。这意味着对于平板电脑上的肖像,OrientationEventListener返回的值为90,而对于手机上的肖像,返回的值为0 我正在使用的活动具有摄像头,因此我无法在方向之间进行更改,因此我使用方向值根据需要在屏幕上重新定位两个元素 是否可以检测设备是否为平板电脑,以便我可以相应地调整值。i、 e.我如何计算iTablet的价值 if(isTable

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

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

是否可以检测设备是否为平板电脑,以便我可以相应地调整值。i、 e.我如何计算iTablet的价值

            if(isTablet)
            {
                orientation += -90;
                if(orientation < 0) //Check if we have gone too far back, keep the result between 0-360
                {
                    orientation += 360;
                }   
            }
if(isTablet)
{
方向+=-90;
if(orientation<0)//检查我们是否向后走得太远,将结果保持在0-360之间
{
方位+=360;
}   
}

既然您提到不能在方向之间切换,那么您必须使用设备的属性来确定它是否是平板电脑

看一看

您可以使用
android.os.Build.DEVICE
android.os.Build.MODEL
android.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);
}
大屏幕和大屏幕尺寸由制造商根据需要确定 在距离眼睛的距离上,它们将被用于(因此 药片)


希望这有帮助

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

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

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

事实上,我用了一个可怕的黑客来解决同样的问题(我真的很惭愧:)。当你得到你的传感器方向,比较它与屏幕大小比(宽与高)

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

int getScreenOrientation(活动ctx){
点pt=新点(0,0);
试一试{
Display dsp=ctx.getWindowManager().getDefaultDisplay();
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.HONEYCOMB){
dsp.getSize(pt);
}否则{
pt.x=dsp.getWidth();
pt.y=dsp.getHeight();
}

return(pt.x还有另一种方法。您可以使用当前配置的方向和显示旋转的组合来确定设备的自然方向,如下所述:。使用此处所述的getDeviceDefaultOrientation()方法,可以按如下方式设置isTablet变量:

isTablet=(getDeviceDefaultOrientation()==Configuration.ORIENTATION\u横向)


如果您的应用程序有时强制配置为纵向或横向模式,您可能希望在应用程序的早期调用getDeviceDefaultOrientation()(在强制配置方向之前)并存储该值以供以后使用。否则,您可能会处于设备的物理旋转与配置方向不同步的状态,就像在设备本身仍有纵向旋转时强制视频进入横向模式以进行全屏观看时经常发生的情况一样。这可以通过调用Activity.setRequested来实现在存储getDeviceDefaultOrientation()的结果后,在运行时执行Orientation().

活动没有被破坏。由于我在曲面视图上使用相机,我不会从纵向更改为横向。因此,每次都不会调用onCreate。相反,我需要听方向传感器并手动重新定位。从技术上讲,我从未离开纵向。我希望有一种方法在SDK中被忽略。我不知道我不认为检查设备/型号/产品说明是一个好主意。但是,检查xlarge/large可能更好。我相信xlarge将涵盖所有7个方面“+平板电脑,不管你怎么想,可能最终会影响galaxy nexus、Samsung note和Samsung S2和S3。感谢你的想法,我会给它一个goConfiguration。SCREENLAYOUT_SIZE_large和4(正如Configuration.SCREENLAYOUT_SIZE_XLARGE是API9),非常有魅力。至少在我这里的物理测试设备上是这样。
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;
}