我使用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;
}
}
答案 0 :(得分:2)
由于您已经提到无法在方向之间进行更改,因此您必须使用设备的属性来确定它是否为平板电脑。
您可以使用android.os.Build.DEVICE
,android.os.Build.MODEL
和android.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和一个电视安卓加密狗上找到它。
“不要像我一样编码,你会没事的。”
肖恩