android系统旋转方向定制问题

目录(?)[+]

0.前言

Android开始是给手机使用的,后来拓展到平板、电视等,那么对于系统旋转及默认方向都要根据需求进行修改了(比如电视默认就是横屏),还有比如我在开发一个定制平板时,由于工艺设计的模具与液晶屏的显示0点方向就偏转了180,这样话关于系统的lanscape,portrait方向都得调整,确实费了不少工费,而关于这些方便的修改可能要改好几个地方,下面我会尽量理出来,环境为android 5.1。


1. 属性

persist.panel.orientation

取值:0,90,180,270

意义:进入android系统时方向(uboot和kernel不受影响,kernel之后滚动画面开始起作用)相对于液晶显示0点逆时针旋转的角度。

影响:多个地方,开机动画,旋转策略,window,surfaceflinger等

frameworks/base/cmds/bootanimation/BootAnimation.cpp

frameworks/base/core/Java/com/android/internal/view/RotationPolicy.java

frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp

frameworks/native/services/surfaceflinger/DisplayDevice.cpp

例子:如下图所示,

android系统旋转方向定制问题_第1张图片

如果想让进入android系统滚动画面的时候,显示如上图的平板默认方向(相对LCD物理显示0点李时珍旋转270°的位置,一般来说物理显示0点在上图的左上角,只是结构跟电子弄错了,错就错着来吧),那么要设置persist.panel.orientation=270,一般在$(PRODUCT).mk中加入

ADDITIONAL_BUILD_PROPERTIES += persist.panel.orientation=270,也可以在其他如init.rc或者qcom.prop加入。

2. 数据库

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

3

取值:0,1,2,3(分别对应0°,90°,180°,270°)

影响:

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

    loadBooleanSetting(stmt, Settings.System.USER_ROTATION,R.integer.def_user_rotation);

这个数据库在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中的updateSettings中使用

                // Configure rotation lock.
            int userRotation = Settings.System.getIntForUser(resolver,
                    Settings.System.USER_ROTATION, Surface.ROTATION_270,
                    UserHandle.USER_CURRENT);
            if (mUserRotation != userRotation) {
                mUserRotation = userRotation;
                updateRotation = true;
            }

这段代码会在进入锁屏界面的时候,在更新一次:如果数据库Settings.System.USER_ROTATION值与persist.panel.orientation不一致,就更新界面方向。设置数据库DatabaseHelper.java的时候要放好位置,最好在公共的地方修改,不要再upgradeVersion判断的地方修改,我就犯错了在不知道版本的情况下修改,导致这个数据库没生效。

3. LANDSCAPE/PORTRAIT 

取值:Surface.ROTATION_0, Surface.ROTATION_90, Surface.ROTATION_180, Surface.ROTATION_270

影响:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

landscape就是的横屏(seascape就是其对面),portrait就是竖屏(upsidedown就是竖屏对立面)

这4个方向也要对应调整,横屏和竖屏决定了应用的横竖屏方向,如应用的AndroidMenifest.xml中android:screenOrientation="portrait",那么该apk运行的window view方向就是mPortraitRotation指定的方向,视频播放软件默认的竖屏也是这个,当播放器点击全屏(就是横屏)就是由mLandscapeRotation决定。按照上面我画的需求,修改如下:

    mPortraitRotation = Surface.ROTATION_180;
    mUpsideDownRotation = Surface.ROTATION_0;                       
    mLandscapeRotation = Surface.ROTATION_270;
    mSeascapeRotation = Surface.ROTATION_90;

你可能感兴趣的:(android)