描述
我有一个活动,在表面视图上显示相机预览.我不希望它在方向更改时重新启动(因为它不断扫描QR码),因此方向被锁定为纵向.
我遇到的问题是我需要在屏幕底部向用户显示屏幕上的说明.鉴于屏幕被锁定在一个方向,我不会收到新方向的通知,因为活动没有重新绘制.因此,无论手机处于纵向,纵向,横向还是尊重的景观,指令都在同一个地方呈现.
为了解决这个问题,我联系了传感器管理器,实时读取方向. (请参阅下面的代码)阅读完之后,我自己制定了方向,并根据需要移动我的说明,因为每次更新都会发送给我.到目前为止,这一直对我有用.在华硕Transformer Prime和Xoom平板电脑上进行测试时.平板电脑将方向返回为“90”表示纵向,而不是像其他2部手机一样返回“0”.因此,您可以在下面的代码中看到,我检查平板电脑(大屏幕)并减去额外的90度.
问题
问题是新的Nexus 7平板电脑没有这种额外的偏见.在肖像中它返回“0”,但我将其检测为平板电脑,因此减去90度因此结果为270并且它将我的指示放置为平板电脑处于横向模式.我假设背后的原因是Xoom / Transformer设计用于横向,Nexus用于纵向,但除非我知道所有受影响的设备,否则无济于事.
题
是否有一种可靠的方法来检测所有设备的方向并“实时”返回结果,如下面的代码所示,但是考虑到设备的默认方向(即Phones Nexus 7是纵向,但大多数平板电脑是横向的)?
现行守则
boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE); boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4); isTablet = large || xlarge; myOrientationEventListener = new OrientationEventListener(getBaseContext(),SensorManager.SENSOR_DELAY_NORMAL) { @Override public void onOrientationChanged(int orientation) { if (orientation == -1) { return; } if (isTablet) { orientation += -90; if (orientation < 0) // keep the result between 0-360 { orientation += 360; } } // Work out the orientation if (orientation >= 60 && orientation <= 140) { screenOrientation = ScreenOrientation.Landscape_Reversed; } else if (orientation >= 140 && orientation <= 220) { screenOrientation = ScreenOrientation.Portrait_Reversed; } else if (orientation >= 220 && orientation <= 300) { screenOrientation = ScreenOrientation.Landscape; } else { screenOrientation = ScreenOrientation.Portrait; } //... Do stuff with new orientation here } };
解决方法
固定它
替换了代码
if (isTablet) { orientation += -90; if (orientation < 0) // keep the result between 0-360 { orientation += 360; } }
有以下几点
//Check "normal" screen orientation and adjust accordingly int naturalOrientation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); if (naturalOrientation == Surface.ROTATION_0) { Logging.d(TAG,"Rotation ROTATION_0"); } else if (naturalOrientation == Surface.ROTATION_90) { Logging.d(TAG,"Rotation ROTATION_90"); orientation += 90; } else if (naturalOrientation == Surface.ROTATION_180) { Logging.d(TAG,"Rotation ROTATION_180"); orientation += 180; } else if (naturalOrientation == Surface.ROTATION_270) { Logging.d(TAG,"Rotation ROTATION_270"); orientation += 270; } if (orientation > 360) // Check if we have gone too far forward with rotation adjustment,keep the result between 0-360 { orientation -= 360; }