Android 屏幕旋转方向和屏幕起始原点的关系

 

我们调试的平板设备大部分默认都是竖屏模式(估计是受手机影响),设备平放,系统自带开机动画界面的显示起始点即为屏幕的起始原点,就是屏幕旋转的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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值