Android屏幕方向因设备而异

时间:2012-08-31 13:16:26

标签: android orientation sensor screen-orientation android-sensors

描述

我有一个活动,在表面视图上显示相机预览。我不希望它在方向更改时重新启动(因为它不断扫描QR码),因此方向被锁定为纵向。

我遇到的问题是我需要在屏幕底部向用户显示屏幕上的说明。鉴于屏幕被锁定在一个方向,我不会收到新方向的通知,因为活动没有重新绘制。因此,无论手机处于纵向,纵向,横向还是受人尊敬的景观,指令都会在同一个地方呈现。

为了解决这个问题,我联系了传感器管理器,实时读取方向。 (请参阅下面的代码)阅读完之后,我自己制定了方向,并根据需要移动我的说明,因为每次更新都会发送给我。到目前为止,这一直对我有用。在华硕Transformer Prime和Xoom平板电脑上进行测试时。平板电脑将方向返回为“90”​​表示纵向,而不是像其他2部手机一样返回“0”。因此,您可以在下面的代码中看到,我检查平板电脑(大屏幕)并减去额外的90度。

问题

问题是新的Nexus 7平板电脑没有这种额外的偏见。在肖像中它返回“0”,但我将其检测为平板电脑,因此减去90度因此结果为270并且它将我的指示放置为平板电脑处于横向模式。我假设这背后的原因是Xoom / Transformer设计用于横向,Nexus用于纵向,但除非我知道所有受影响的设备,否则无济于事。

问题

是否有一种可靠的方法来检测所有设备的方向并以“实时”方式返回结果,如下面的代码所示,但是考虑到设备的默认方向(即Phones + Nexus 7是纵向,但是大多数平板电脑是风景)?

当前代码

    boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
    boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);       
    isTablet = large || xlarge;
    myOrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_NORMAL)
    {

        @Override
        public void onOrientationChanged(int orientation)
        {
            if (orientation == -1)
            {
                return;
            }

            if (isTablet)
            {
                orientation += -90;
                if (orientation < 0) // keep the result between 0-360
                {
                    orientation += 360;
                }
            }

            // Work out the orientation

            if (orientation >= 60 && orientation <= 140)
            {
                screenOrientation = ScreenOrientation.Landscape_Reversed;
            }
            else if (orientation >= 140 && orientation <= 220)
            {
                screenOrientation = ScreenOrientation.Portrait_Reversed;
            }
            else if (orientation >= 220 && orientation <= 300)
            {
                screenOrientation = ScreenOrientation.Landscape;
            }
            else
            {
                screenOrientation = ScreenOrientation.Portrait;
            }

            //... Do stuff with new orientation here
        }
    };

1 个答案:

答案 0 :(得分:6)

修正了它

替换了代码

        if (isTablet)
        {
            orientation += -90;
            if (orientation < 0) // keep the result between 0-360
            {
                orientation += 360;
            }
        }

使用以下

            //Check "normal" screen orientation and adjust accordingly
            int naturalOrientation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
            if (naturalOrientation == Surface.ROTATION_0)
            {
                Logging.d(TAG, "Rotation ROTATION_0");
            }
            else if (naturalOrientation == Surface.ROTATION_90)
            {
                Logging.d(TAG, "Rotation ROTATION_90");
                orientation += 90;
            }
            else if (naturalOrientation == Surface.ROTATION_180)
            {
                Logging.d(TAG, "Rotation ROTATION_180");
                orientation += 180;
            }
            else if (naturalOrientation == Surface.ROTATION_270)
            {
                Logging.d(TAG, "Rotation ROTATION_270");
                orientation += 270;
            }

            if (orientation > 360) // Check if we have gone too far forward with rotation adjustment, keep the result between 0-360
            {
                orientation -= 360;
            }