2011-04-27 80 views
0

我使用Display.getRotation()并在onCreate()方法中简单地显示带有Toast消息的旋转,因为每次都调用onCreate()你旋转屏幕。Display.getRotation()不完全适用于设备的180度翻转

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

比方说,我将设备保持在0度的“自然”旋转中。如果我顺时针旋转90度,我可以获得270度,如果我逆时针旋转90度,我可以获得90度。但是,如果我快速将设备旋转180度,即足够快以至于没有通过90度旋转或270度旋转的转变,则整个图像确实会旋转,但旋转仍然被报告为原始0度。如果我在任一方向上旋转90度,它就可以工作得很好,但如果再做180度翻转,图像也会旋转,但它仍会报告原始的90度。

这里的交易是什么?有任何想法吗?

我会尝试一些更多的实验,如果我知道它,我会张贴结果。

+0

因此,当我做180翻转时,似乎onCreate()或甚至onResume()不会被执行。所以也许这不是应用程序检测旋转的正确方法。任何人都知道我是否可以使用某种“onRotate”侦听器? – 2011-04-27 14:23:58

+0

嗨,安迪jay.I我面临同样的问题,当我快速打开设备.plz告诉我如何检测突然180度turn.thanks – Amrendra 2013-04-25 06:24:30

+0

我从来没有能够找出一种方法来检测。对不起,哥们。 :( – 2013-04-26 20:52:47

回答

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。

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

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()。