Display.getRotation()并不完全适用于设备的180度翻转

时间:2011-04-27 01:21:17

标签: android screen-orientation

我正在使用Display.getRotation()并在onCreate()方法中使用toast消息显示旋转,因为每次旋转屏幕时都会调用onCreate()。

无论如何,我发现了一些奇怪的行为,我认为最好用一个例子来解释。

假设我把设备保持在0度的“自然”旋转中。如果我顺时针旋转90度,我会得到270度,如果我逆时针旋转90度,我会得到90度。但是,如果我快速旋转设备180度,这足够快,以便没有通过90度旋转或270度旋转的过渡,整个图像确实旋转,但旋转仍然报告为原始0度。

假设我保持在90度,如果我向任一方向旋转90度,它可以正常工作,但是如果我再进行180度翻转,图像会旋转,但它仍会报告原始的90度。 / p>

这是什么交易?有什么想法吗?

我将尝试更多的实验,如果我弄清楚,我会发布结果。

2 个答案:

答案 0 :(得分:1)

来自the documentation

public int getRotation ()

自:API等级8 返回屏幕从“自然”方向的旋转。返回的值可能是Surface.ROTATION_0(无旋转),Surface.ROTATION_90,Surface.ROTATION_180或Surface.ROTATION_270。例如,如果设备具有自然高的屏幕,并且用户将其侧面转向横向,则此处返回的值可以是Surface.ROTATION_90或Surface.ROTATION_270,具体取决于它的转向。角度是屏幕上绘制图形的旋转,这是设备物理旋转的相反方向。例如,如果设备逆时针旋转90度,则补偿渲染将顺时针旋转90度,因此此处返回的值将为Surface.ROTATION_90。

我希望这能为你澄清一些事情。

答案 1 :(得分:0)

所以...我似乎在HTC上有这个问题,运行cyanogenmod。 上面的答案似乎没有回答这个问题,但也许我只是错过了它。

我用orientationEventListener解决了,同时还使用onresume和Display.getRotation()来跟踪方向(我用这个来设置图像文件中的exif旋转数据)。

在onResume我做:

if (display.getRotation() == Surface.ROTATION_0){  // portrait
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_90;
}else if (display.getRotation() == Surface.ROTATION_270){ // CW 90
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_180;
}else if (display.getRotation() == Surface.ROTATION_180){  // portrait inverted
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_270;
}else{ // CW 270
    mPicOrientation = ExifInterface.ORIENTATION_ROTATE_270;
}

在onCreate中我设置了一个实现onOrientationChange的orientationEventListener:

OrientationEventListener mOrientationEventListener = new OrientationEventListener(
        context, SensorManager.SENSOR_DELAY_NORMAL) {

    @Override
    public void onOrientationChanged(int orientation) {

            if (orientation >= 315 && orientation < 45) {  // portrait upright
                mPicOrientation = ExifInterface.ORIENTATION_ROTATE_90;
            } else if (orientation >= 45 && orientation < 135) {  // CW 90
                mPicOrientation = ExifInterface.ORIENTATION_ROTATE_180;
            } else if (orientation >= 135 && orientation < 225) { // portrait upside down
                // FIXME: this one is also 270??  display.getrotation is broken at least...
                mPicOrientation = ExifInterface.ORIENTATION_ROTATE_270;
            } else if (orientation >= 225 && orientation < 315) {
                mPicOrientation = ExifInterface.ORIENTATION_ROTATE_270;
            }

        //Log.d(picGlobals.TAG, "orientation: " + orientation + " surface_rotation: " + mPicOrientation);
    }
};
if (mOrientationEventListener.canDetectOrientation()) {
    mOrientationEventListener.enable();
}

图片所需的合成旋转是非感性的,具有纵向反转方向。我不知道为什么。它可能是我测试过的少数设备 我将在模拟器中再次测试,但是它真的很难分辨它的模拟相机图片是否颠倒(感谢谷歌)。 当肖像倒置时,它的工作时间大多数。但并不是所有的时间。让我疯了,但是谁真的想以这种方式拍摄照片呢? orientationEventListener每次都有效。但它当然不会触发,直到你真正改变方向(不确定阈值是多少)。这就是为什么我在onResume中有Display.getRotation()。