最近公司想要做个横屏的设备,考虑到是小屏,LCM由于工艺,防摔等因素不好替换,Manager让研究下竖屏横用。
需要考虑的方面:
kernel_logo,bootanimation,系统,recovery ui,charger (关机充电)等。
qualcomm的kernel_logo在splash.img里
目录:
vendor\action\splash\android_720X1280.png,替换成横屏的
frameworks\base\cmds\bootanimation\BootAnimation.cpp
status_t BootAnimation::readyToRun() {
...
mAssets.addDefaultAssets();
sp dtoken(SurfaceComposerClient::getBuiltInDisplay(
ISurfaceComposer::eDisplayIdMain));
DisplayInfo dinfo;
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
if (status)
return -1;
//potter add
int temp = dinfo.h;
dinfo.h= dinfo.w;
dinfo.w= temp;
Rect destRect(dinfo.w, dinfo.h);
mSession->setDisplayProjection(dtoken, 1, destRect, destRect);//orient=1
//potter end
...
}
device\honeywell\common\bootanimation.zip
每张图都替换成横屏的。这里要注意下,由于前面BootAnimation.cpp做了顺时针90度处理,所以这里的图片需要在kernel_logo的这种处理方法上再逆时针转个90度。为什么BootAnimation.cpp中做顺时针90度处理,是因为后面上层的WMS里面预设角度从0变成90度了(android N是在WMS修改的,而Android O是在DisplayContent里面)。如果不处理,WMS起来的时候,bootanimation还没走完,剩下的一小段的bootanimation会转个90度,会不一致。(这个大家可以实际测试看看效果)
重编或者adb push 到system/media目录,然后重启手机看效果。
frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
public int rotationForOrientationLw(int orientation, int lastRotation) {
...
default:
// For USER, UNSPECIFIED, NOSENSOR, SENSOR and FULL_SENSOR,
// just return the preferred orientation we already calculated.
if (preferredRotation >= 0) {
return preferredRotation;
}
//potter change
//return Surface.ROTATION_0;
return Surface.ROTATION_90;
//potter end
...
}
frameworks\base\services\core\java\com\android\server\wm\DisplayContent.java
//potter change
//private int mRotation = 0;
private int mRotation = 1;
//potter end
这两处修改后,进入系统就已经是默认横屏了。
但是要考虑一个问题,systemui里面有自动旋转的功能。这个QSTile打开,那么是自动旋转,可以横竖屏切换,关闭就锁定竖屏了。
这显然不是我们想要的。由于我们现在是竖屏横用,所以我们希望是QSTile打开,自动旋转,关闭的话锁定横屏。所以有了下面两处的修改。
frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tiles\RotationLockTile.java
public static boolean isCurrentOrientationLockPortrait(RotationLockController controller,
Context context) {
//potter change
return false;
/*
int lockOrientation = controller.getRotationLockOrientation();
if (lockOrientation == Configuration.ORIENTATION_UNDEFINED) {
// Freely rotating device; use current rotation
return context.getResources().getConfiguration().orientation
!= Configuration.ORIENTATION_LANDSCAPE;
} else {
return lockOrientation != Configuration.ORIENTATION_LANDSCAPE;
}
*/
//potter end
}
其实这里直接返回false有点粗暴,可能会有隐患,有兴趣的朋友可以深入研究下看怎么优雅点。
frameworks\base\core\java\com\android\internal\view\RotationPolicy.java
//potter change
//private static final int NATURAL_ROTATION = Surface.ROTATION_0;
private static final int NATURAL_ROTATION = Surface.ROTATION_90;
//potter end
如果完全不需要自动旋转这个功能。那么在
\frameworks\base\core\res\res\values\config.xml
改成false。这样就不能自动旋转了,但是你需要自己去systemui中把自动旋转的qstile remove掉,要不ui还在。
我们知道,默认锁屏和Launcher是不能自动旋转的。
其实也是可以设置的,针对锁屏:
frameworks\base\core\res\res\values\config.xml
改成true就行。
针对Laucher:
从Android N开始:
桌面空白处长按→进入OverviewMode→点击设置→打开允许旋转的开关
实际Android 默认是有这个功能的。只是默认在手机上没打开,大的平板还是打开了的。
packages/apps/Launcher3/res/xml/launcher_preferences.xml:43: android:defaultValue="@bool/allow_rotation"
packages/apps/Launcher3/res/values/config.xml:10:
packages/apps/Launcher3/res/values-sw600dp/config.xml:3:
如果想要默认打开:
packages/apps/Launcher3/res/values/config.xml
改成true即可。
recovery ui和charger暂时还没研究到,后头补充。希望对大家有用。