我正在使用Display.getRotation()并在onCreate()方法中使用toast消息显示旋转,因为每次旋转屏幕时都会调用onCreate()。
无论如何,我发现了一些奇怪的行为,我认为最好用一个例子来解释。
假设我把设备保持在0度的“自然”旋转中。如果我顺时针旋转90度,我会得到270度,如果我逆时针旋转90度,我会得到90度。但是,如果我快速旋转设备180度,这足够快,以便没有通过90度旋转或270度旋转的过渡,整个图像确实旋转,但旋转仍然报告为原始0度。
假设我保持在90度,如果我向任一方向旋转90度,它可以正常工作,但是如果我再进行180度翻转,图像会旋转,但它仍会报告原始的90度。 / p>
这是什么交易?有什么想法吗?
我将尝试更多的实验,如果我弄清楚,我会发布结果。
答案 0 :(得分:1)
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()。