赞
踩
最近公司想要做个横屏的设备,考虑到是小屏,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<IBinder> 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
<bool name="config_supportAutoRotation">true</bool>
改成false。这样就不能自动旋转了,但是你需要自己去systemui中把自动旋转的qstile remove掉,要不ui还在。
我们知道,默认锁屏和Launcher是不能自动旋转的。
其实也是可以设置的,针对锁屏:
frameworks\base\core\res\res\values\config.xml
<bool name="config_enableLockScreenRotation">false</bool>
改成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: <bool name="allow_rotation">false</bool>
packages/apps/Launcher3/res/values-sw600dp/config.xml:3: <bool name="allow_rotation">true</bool>
如果想要默认打开:
packages/apps/Launcher3/res/values/config.xml
<bool name="allow_rotation">false</bool>
改成true即可。
recovery ui和charger暂时还没研究到,后头补充。希望对大家有用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。