我们调试的平板设备大部分默认都是竖屏模式(估计是受手机影响),设备平放,系统自带开机动画界面的显示起始点即为屏幕的起始原点,就是屏幕旋转的0°角。
假定设备初始方向为竖屏模式,LCD的起始原点有可能出现在两个位置,即上图中的左下角①和右上角③。
关于LCD起始原点和旋转方向,系统中有一个配置项进行了说明,如下:
If true, the direction rotation is applied to get to an application's requested orientation is reversed. Normally, the model is that landscape is clockwise from portrait; thus on a portrait device an app requesting landscape will cause a clockwise rotation, and on a landscape device an app requesting portrait will cause a counter-clockwise rotation. Setting true here reverses that logic.
<bool name="config_reverseDefaultRotation">false</bool>
如果为true,则向应用程序请求的旋转方向是颠倒。通常情况下(设置为false),景观(横屏)模型是竖屏模式顺时针方向旋转得到的;因此在竖屏设备上,应用程序请求横屏模式需要顺时针旋转,在横屏设备上,应用程序请求竖屏模式需要逆时针旋转。设置为true将颠倒了这个逻辑。
public void setInitialDisplaySize(Display display, int width, int height, int density)
{
// This method might be called before the policy has been fully initialized
// or for other displays we don't care about.
if (mContext == null || display.getDisplayId() != Display.DEFAULT_DISPLAY)
{ return; }
mDisplay = display;
final Resources res = mContext.getResources();
int shortSize, longSize;
if (width > height) {
//初始化为横屏模式
shortSize = height;
longSize = width;
mLandscapeRotation = Surface.ROTATION_0;
mSeascapeRotation = Surface.ROTATION_180;
if (res.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)) {
A: LCD的原始起点,即0°角在右下角④,这种设置基本不会出现
mPortraitRotation = Surface.ROTATION_90;
mUpsideDownRotation = Surface.ROTATION_270;
} else {
B: LCD的原始起点,即0°角在左上角②,横屏默认起始原点
mPortraitRotation = Surface.ROTATION_270;
mUpsideDownRotation = Surface.ROTATION_90;
}
} else {
//初始化为竖屏模式
shortSize = width;
longSize = height;
mPortraitRotation = Surface.ROTATION_0;
mUpsideDownRotation = Surface.ROTATION_180;
if (res.getBoolean(com.android.internal.R.bool.config_reverseDefaultRotation)) {
C: LCD的原始起点,即0°角在右上角③
mLandscapeRotation = Surface.ROTATION_270;
mSeascapeRotation = Surface.ROTATION_90;
} else {
D:LCD的原始起点,即0°角在左下角①,竖屏默认起始原点
mLandscapeRotation = Surface.ROTATION_90;
mSeascapeRotation = Surface.ROTATION_270;
}
}
假定我们设备物理上的竖屏(portrait)和横屏(landscape )方向如上图所示。
1:android系统默认config_reverseDefaultRotation=false,如果竖屏模式(portrait)LCD的原始起点在左下角①,顺时针旋转90°到②,得到横屏(landscape )式, 系统执行D处代码,物理设备的表现和系统代码设置的参数一致。
2:如果竖屏模式(portrait)LCD的原始起点在右上角③,设置config_reverseDefaultRotation=true.逆时针旋转90°(顺时针270°)到②,得到横屏(landscape )模式,系统执行C处代码,物理设备的表现和系统代码设置的参数一致。
3:如果竖屏模式(portrait)LCD的原始起点在右上角③,设置config_reverseDefaultRotation=false. 系统执行D处代码,物理设备的表现和系统代码设置的参数不一致。实际为代码 mLandscapeRotation = Surface.ROTATION_90; 表示系统代码设定顺时针旋转90°为landscape模式,但是实际上物理设备的LCD界面从右上角③,顺时针旋转90°到④,得到海景(Seascape)模式。如果应用APP设置为landscape模式显示,你就会发现应用界面在设备上显示方向是颠倒的。
4:设备LCD的起始原点和物理设备设定的横竖屏方向需要正确匹配,最好按照android系统默认的旋转关系,即config_reverseDefaultRotation=false的旋转规则。如上图设备所要求的横竖屏方向,LCD的起始原点0°角最好定在左下角①的位置,然后再调整重力Sensor的方向,使机器旋转也显示方向正确。最后调整摄像头,使摄像头的方向正常(如果软件始终调试都不正常,就需要重新打样摄像头)。
5:如上图设备所要求的横竖屏方向,因为LCD的装配问题,将LCD的起始原点0°角定在右上角③的位置,虽然config_reverseDefaultRotation=true,也能将LCD的横竖屏的关系调整正常。但是实际项目中出现过部分播放器在横屏模式下全屏播放视频颠倒,部分应用APP调用摄像头,拍照方向会存在方向颠倒的问题,对于没有源码的APP出现摄像头的方向颠倒的问题,我个人没有找到好的办法解决。
6:对于因装配问题将LCD的起始原点0°角定在右上角③的位置,最好通过修改LCD驱动,调整LCD显示原点的位置,将LCD的显示原点修改为左下角①,然后使用android系统默认的旋转规则,这样项目中能省掉很多麻烦。
2021-03-13-001