检测Android方向:横向左v.横向右
Posted
技术标签:
【中文标题】检测Android方向:横向左v.横向右【英文标题】:Detect Android orientation: landscape-Left v. landscape-Right 【发布时间】:2011-01-18 18:46:51 【问题描述】:如何检测手机 4 面中的哪一面朝上。
我可以检测纵向/横向模式,但是如何区分 横向转向左侧 和 横向转向右侧?
基本上我想在用户转动手机时制作一个漂亮的过渡动画。你知道,就像在 iPhone 的 Safari 中一样:从以前的布局快速旋转 400 毫秒到新的布局。
【问题讨论】:
【参考方案1】:使用 OrientationEventListener:
mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL)
@Override
public void onOrientationChanged(int orientation)
mDeviceOrientation = orientation;
;
if(mOrientationEventListener.canDetectOrientation())
mOrientationEventListener.enable();
mDeviceOrientation 应该是一个整数,告诉您设备旋转到的角度,如果您进行一些巧妙的舍入,您应该能够看到它在四个方向中的哪一个:
// Divide by 90 into an int to round, then multiply out to one of 5 positions, either 0,90,180,270,360.
int orientation = 90*Math.round(mDeviceOrientation / 90);
// Convert 360 to 0
if(orientation == 360)
orientation = 0;
享受吧!
【讨论】:
您的舍入代码错误。你想要: (90*Math.round(mDeviceOrientation/90))%360;除此之外,您可能希望处理返回 ORIENTATION_UNKNOWN 的情况,请参阅文档。 但显然有点偏离,也许是因为 SENSOR_DELAY_NORMAL。在 onOrientationChanged 之前调用视图的渲染,所以在我需要渲染的地方还没有关于方向更改的信息。 我刚刚注意到这个,不知道它是否有效... Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); display.getRotation();它的 api 级别只有 8+ :/ 请记住,在 OnOrientationChanged 中返回的方向值与设备的自然位置相关,并且有些设备的自然位置为横向。见android-developers.blogspot.com/2010/09/… 只是我自己实现了这个,分成四部分并不像这个回复那么简单。我有 0 度垂直向下和围绕屏幕逆时针测量的旋转。因此Portrait在305>0 【参考方案2】:刚刚遇到 :) 2.2+ 将 xml 代码放入你的 res/values(false) 和 res/values-xlarge(true)
<resources>
<bool name="isTablet">false</bool>
private void getScreenRotationOnPhone()
final Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
switch (display.getRotation())
case Surface.ROTATION_0:
System.out.println("SCREEN_ORIENTATION_PORTRAIT");
break;
case Surface.ROTATION_90:
System.out.println("SCREEN_ORIENTATION_LANDSCAPE");
break;
case Surface.ROTATION_180:
System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT");
break;
case Surface.ROTATION_270:
System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE");
break;
private void getScreenRotationOnTablet()
final Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
switch (display.getRotation())
case Surface.ROTATION_0:
System.out.println("SCREEN_ORIENTATION_LANDSCAPE");
break;
case Surface.ROTATION_90:
System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT");
break;
case Surface.ROTATION_180:
System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE");
break;
case Surface.ROTATION_270:
System.out.println("SCREEN_ORIENTATION_PORTRAIT");
break;
private boolean isTabletDevice()
boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
if (tabletSize)
return true;
else
return false;
【讨论】:
不幸的是,此代码不适用于将“自然位置”设置为横向的设备(例如某些平板电脑)。如果有人知道如何找到设备的“自然位置”,请分享。真可惜在 Android 中没有 API 可以做到这一点。 确实如此。我也将代码编辑为平板电脑的版本。谢谢朋友!希望他们会为此发布 API。【参考方案3】:看来您应该能够从screenOrientation 中分辨出来,通过getRequestedOrientation 获得
【讨论】:
不,这不好,它只会返回横向或纵向。我需要的是哪个的风景。当您将手机向左或向右转动时,Android 会以两个相反的方向呈现 UI。 是的,我认为 reverse_landscape 和 reverse_portrait 的值会告诉你这一点。请注意,这些仅在 API 级别 9 中可用。您使用的是什么版本的 SDK?你在什么设备上测试?如果您运行的是 2.3 或更高版本,您大概只能获得此信息。 实际上是的,API9 确实提到了“反向”部分。可惜他们没有早点想到。我认为现在期待 2.3 是不合理的——几乎还没有运行它的设备。 我很想用该信息反转“-1”,但它不允许我:-(以上是关于检测Android方向:横向左v.横向右的主要内容,如果未能解决你的问题,请参考以下文章
检测“samsung galaxy Android 2.3.5”的方向(横向和纵向模式)的事件