检测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.横向右的主要内容,如果未能解决你的问题,请参考以下文章

Android 屏幕方向:横向回到纵向

横向旋转后推送方向变化

检测“samsung galaxy Android 2.3.5”的方向(横向和纵向模式)的事件

Android:如何在设置图像视图时检测从图库中选择的图像方向(纵向或横向)?

在 iOS 中检测 PAN 手势的方向

从右横向直接更改为横向左