使用android.hardware.Camera,为了使摄像机输出适当地跟踪设备运动,我们需要连接OrientationEventListener到setDisplayOrientation()方法Camera.这样,当用户扭转设备时,我们可以保持相机预览中的"向上"与现实世界中的"向上"同步.对于围绕Y轴旋转设备(即,从横向翻转到反向横向或向后),尤其如此.
对于大多数方向更改,android.hardware.camera2API似乎"正常工作".但是,对于Y轴旋转(横向 - >反向横向或反向横向),相机预览会被反转.
什么是调用相当于setDisplayOrientation()上Camera了Camera2 API,所以我们可以处理这种情况?
我已经看到了一些与此类似但没有答案的其他问题.
从纵向旋转到横向(任一方向)再返回,我们得到对onConfigurationChanged()的有用调用.
但是,当从景观旋转到横向(通过180度)时,onConfigurationChanged()不会被调用.
我已经看到过使用OrientationEventListener,但这对我来说似乎很有趣,因为你可以快速旋转而不会触发显示方向的改变.
我已经尝试添加布局更改侦听器,但没有成功.
那么问题是,如何可靠地检测横向方向的这种变化?
我有一个显示指南针的活动,我需要知道屏幕的方向以正确旋转针.我需要区分90°和270°旋转才能正确处理.
当我旋转屏幕(至少在我的Nexus S上)时,onCreate会调用活动,例如当我从纵向模式旋转到横向模式时.当我从一个横向模式旋转到另一个横向边缘凸起时,onCreate()会被调用两次(一次用于纵向,一次用于目标横向模式).
但是,当我以底边向上旋转时,屏幕旋转180°并且onCreate不会被调用.在这种情况下会有被触发的事件吗?
我使用以下代码为每个用户首选项设置方向锁定:
private void doLock(boolean locked) {
if (locked) {
int o = getResources().getConfiguration().orientation;
if (o == Configuration.ORIENTATION_LANDSCAPE)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
else if (o == Configuration.ORIENTATION_PORTRAIT)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理,除了我处于解锁模式(SCREEN_ORIENTATION_SENSOR)的情况下屏幕显示LANDSCAPE正确(!),然后调用doLock(true)和...
而不是屏幕锁定到LANDSCAPE其当前(正确)横向视图,它锁定到倒置的横向视图.即同样精确但垂直翻转(y变为-y).
为什么这样,我如何处理这个问题才能解决它?
我的初步调查显示除了常见的两个(,)之外还有很多其他可能性,包括,但是我的预感告诉我这个问题可能取决于设备,所以通过使用它我可能只是为我的手机修复问题但不适用于所有其他设备.portraitlandscapereverseLandscape
有没有办法在所有设备中强制正确landscape定位(切换时sensor)?
为了使这更清晰,更容易重现,以下是显示问题的步骤:
SCREEN_ORIENTATION_SENSOR),屏幕显示LANDSCAPE正确(!),doLock(true)LANDSCAPE当前(正确)的横向视图中,而是锁定到倒置的横向视图.即同样精确但垂直翻转(y变为-y).如果我将左侧底座更改为右侧底座(两者都是用户的横向视图模式),则应用程序(活动)不会重新创建。Hense,相机显示为水平翻转图像。当我尝试为两种纵向模式(正常和反向)更改设备位置时,结果相同。设备正常检测到 90 度旋转。也就是说,左侧 => 纵向 => 右尺寸 => 反向纵向 => 左侧正常工作!
有没有可能解决这个问题?
我使用的是安卓 4.4.4。
代码:
Display display = ((WindowManager)context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0){//0
mCamera.setDisplayOrientation(90);
}else if(display.getRotation() == Surface.ROTATION_90){//1
mCamera.setDisplayOrientation(0);
}else if(display.getRotation() == Surface.ROTATION_180){//2
mCamera.setDisplayOrientation(270);
}else if(display.getRotation() == Surface.ROTATION_270){//3
mCamera.setDisplayOrientation(180);
}
Log.d(TAG, "ROTATION:" + display.getRotation() + " ");
Run Code Online (Sandbox Code Playgroud)
编辑
我的意思是,onResume()和SurfaceCreate()我通过180度的视角旋转设备从不打电话。
编辑功能代码
SurfaceView sfv;
FrameLayout fl0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code to initialize
fl0 = (FrameLayout) findViewById(R.id.fl0);
sfv = new SurfaceView(this);
fl0.addView(sfv, 0);
addSurfaceHolder();
} …Run Code Online (Sandbox Code Playgroud)