android开始是给手机使用的,后来拓展到平板、电视等,那么对于系统旋转及默认方向都要根据需求进行修改了(比如电视默认就是横屏),还有比如我在开发一个定制平板时,由于工艺设计的模具与液晶屏的显示0点方向就偏转了180,这样话关于系统的lanscape,portrait方向都得调整,确实费了不少工费,而关于这些方便的修改可能要改好几个地方,下面我会尽量理出来,环境为android 5.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系统滚动画面的时候,显示如上图的平板默认方向(相对LCD物理显示0点李时珍旋转270°的位置,一般来说物理显示0点在上图的左上角,只是结构跟电子弄错了,错就错着来吧),那么要设置persist.panel.orientation=270,一般在$(PRODUCT).mk中加入
ADDITIONAL_BUILD_PROPERTIES += persist.panel.orientation=270,也可以在其他如init.rc或者qcom.prop加入。
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
取值: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判断的地方修改,我就犯错了在不知道版本的情况下修改,导致这个数据库没生效。
取值: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;