这个问题已经在这里有了答案: > Rotating phone quickly 180 degrees, camera preview turns upside down 2个
如果我将“左侧基准”更改为“右侧基准”(均为用户的横向视图模式),则不会重新创建应用程序(活动).诚然,相机显示为水平翻转图像.当我尝试为两种纵向模式(正常和反向)更改设备位置时,结果相同.设备正常检测到90度旋转.即,左侧=>画像=>正确大小=>反像=>左侧正常工作!
有可能解决这个问题吗?
我正在使用AndroID 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() + " ");
编辑
我的意思是,当我将设备旋转180度时,永远不会调用onResume()和SurfaceCreate().
编辑功能代码
SurfaceVIEw sfv;FrameLayout fl0; @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);//some code to initializefl0 = (FrameLayout) findVIEwByID(R.ID.fl0); sfv = new SurfaceVIEw(this); fl0.addVIEw(sfv,0);addSurfaceHolder();}private voID addSurfaceHolder(){ SurfaceHolder holder = sfv.getHolder(); holder.addCallback(new SurfaceHolder.Callback() { @OverrIDe public voID surfaceCreated(SurfaceHolder holder) { Log.d(TAG,TAG + " surfaceCreated");//this function never calls for 180 deg rotation. cameraStart(MainActivity.this,false); //some code for camera holder connection } @OverrIDe public voID surfaceChanged(SurfaceHolder holder, int format, int wIDth, int height) { Log.d(TAG,TAG + " surfaceChanged"); } @OverrIDe public voID surfaceDestroyed(SurfaceHolder holder) { ///Some code to destroy camera Log.d(TAG,TAG + " surfaceDestroyed"); } }); } @OverrIDe protected voID onResume() { super.onResume(); Log.d(TAG,TAG + " onResume");//call for 90 deg rotation. not for 180 deg rotation. }public static voID cameraStart(Context context, boolean startStopPrevIEw){ if (mCamera == null) { mCamera = Camera.open(CAMERA_ID);//0 } Camera.Parameters cameraParam = mCamera.getParameters(); Camera.Size prevIEwSize = cameraParam.getPrevIEwSize(); prevIEwFormat = cameraParam.getPrevIEwFormat(); frameWIDth = prevIEwSize.wIDth; frameHeight = prevIEwSize.height; frameRect = new Rect(0, 0, frameWIDth, frameHeight); 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() + " ");//just calles for 90 deg rotation. not for 180 deg.}
解决方法:
您需要获取相机的支持参数,如下所示:
Camera.Parameters parameters = camera.getParameters();
并在mCamera.setdisplayOrIEntation(int);之前添加此行;
parameters.setRotation(int);
例如:
if(display.getRotation() == Surface.ROTATION_0){//0 parameters.setRotation(90); mCamera.setdisplayOrIEntation(90);}else if(display.getRotation() == Surface.ROTATION_90){//1 parameters.setRotation(0); mCamera.setdisplayOrIEntation(0);}else if(display.getRotation() == Surface.ROTATION_180){//2 parameters.setRotation(270); mCamera.setdisplayOrIEntation(270);}else if(display.getRotation() == Surface.ROTATION_270){//3 parameters.setRotation(180); mCamera.setdisplayOrIEntation(180);}
希望这能回答您的问题
编辑
上面的代码也需要出现在onResume()方法中,因为每次更改方向时都会调用onDestroy(),然后调用onCreate(),因此onResume()需要具有这段代码以及onCreate().
编辑2
看一下OrientationEventListener
更多内容请看this问题,以获取有关OrIEntationEventListener的提示
希望您会发现此答案有用.
总结以上是内存溢出为你收集整理的Java-旋转180度android无法正常工作全部内容,希望文章能够帮你解决Java-旋转180度android无法正常工作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)