/override/frameworks/base/cmds/bootanimation/BootAnimation.cpp
加上
int temp = resolution.height;
+
+ resolution.height= resolution.width;
+ resolution.width= temp;
+
+ Rect destRect(resolution.width, resolution.height);
+
+ SurfaceComposerClient::Transaction t;
+ t.setDisplayProjection(mDisplayToken, ui::ROTATION_90, destRect, destRect);
+ t.apply();
上面是开机动画横屏,开机logo横屏
在override/vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp
里面的anim_drm_init方法的else 里 phical_screen.rotation原本是0,就是竖屏,改成90.
在anim_fb_init方法里也同理int rotation = ORIENTATION_90;
在/vendor/mediatek/proprietary/external/libshowlogo/show_animation_common.c
文件里anim_fb_init方法同理
但其实除了改else的,也可以直接改最开始的rotation,让他锁定在一个判断内
源码是 int rotation = getRotation();
改成int rotation = ORIENTATION_90; 那这样就只能走 以下判断
else if (ORIENTATION_90 == rotation)
{ //90
phical_screen.rotation = 90;
}
下面这个文件 或许没用到,mediatek/proprietary/bootable/bootloader/lk/platform/mt6765/mt_logo.c
里面有个init_fb_screen方法的else里phical_screen.rotation = 0;换成90
override/vendor/mediatek/proprietary/packages/apps/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
在加loadSetting(stmt, Settings.System.USER_ROTATION,1);
下面开始是默认横屏
override/frameworks/base/core/java/com/android/internal/view/RotationPolicy.java
把public static final int NATURAL_ROTATION = Surface.ROTATION_0换成90
override/frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java
修改底部虚拟按键方向位置,里面把底部导航栏写死在底部出现
int navigationBarPosition(int displayWidth, int displayHeight, int displayRotation) {
/*/ tyd.dkl, def landscape
if (navigationBarCanMove() && displayWidth > displayHeight) {
if (displayRotation == Surface.ROTATION_270) {
return NAV_BAR_LEFT;
} else if (displayRotation == Surface.ROTATION_90) {
return NAV_BAR_RIGHT;
}
}
//*/
return NAV_BAR_BOTTOM;
}
就中间那一块注释
这里面
mNavigationBarCanMove =
mDisplayContent.mBaseDisplayWidth != mDisplayContent.mBaseDisplayHeight
&& res.getBoolean(R.bool.config_navBarCanMove);
所以找到这个布尔值config——navBarCanMove,在framework下就是false,但是我们已经设置了90度,所以会跳到右边
override/frameworks/base/services/core/java/com/android/server/wm/DisplayRotation.java
private int mRotation;赋值为1;
private int mUserRotation = Surface.ROTATION_0;改为90
在这个循环里面,的
switch (orientation) {
default:
里面return Surface.ROTATION_0;把这个换成90
override/frameworks/native/services/surfaceflinger/DisplayDevice.cpp
setProjection(ui::ROTATION_0, Rect::INVALID_RECT, Rect::INVALID_RECT);
换成90
改到这里后效果的确是默认横屏了,但是开启了自动旋转后,无法转动屏幕。
所以要在launcher上改主屏可旋转
override/packages/apps/Launcher3/res/xml/launcher_preferences.xml
android:key="pref_allowRotation"
android:title="@string/allow_rotation_title"
android:summary="@string/allow_rotation_desc"
- android:defaultValue="false"
+ android:defaultValue="true"
android:persistent="true"
默认值换成true,但这个显然是没用的,就是长按屏幕进主屏幕设置里面有个主屏幕旋转开关,这个xml只是把这个开关改成true默认,每次进来之后重新赋值,所以刷机之后还是无法旋转。
所以
主屏幕可旋转
override/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java
allowRotation = originalSmallestWidth >= MIN_TABLET_WIDTH;
这个直接改成true;
这个因为我们把这个屏幕改成默认横屏了,那么他这个originalSmallestWidth就变小了,因为以前默认的是竖屏,所以那这样就返回false, 就是不允许旋转。原本它的宽是竖着看的长,现在的宽就变成短的那个边。
这个改完之后我们会发现主屏幕设置里面那个主屏旋转的开关没了。那其实就不需要改那个xml文件了,原理如下
还是在Launcher3里面有个src/com/android/launcher3/states/RotationHelper.java
public void initialize() {
if (!mInitialized) {
mInitialized = true;
setIgnoreAutoRotateSettings(mActivity.getDeviceProfile().allowRotation);
mActivity.addOnDeviceProfileChangeListener(this);
notifyChange();
}
}
初始化方法里面setIgnoreAutoRotateSettings(mActivity.getDeviceProfile().allowRotation);
里面参数就是刚刚改的true。这个忽视自动旋转设置的方法,就是移除这个菜单而已
private void setIgnoreAutoRotateSettings(boolean ignoreAutoRotateSettings) {
// On large devices we do not handle auto-rotate differently.
源码里面也给了,大屏设备就是会忽略掉这个选项的,只不过这个项目估计源码不是正宗对应的,虽然机器是平板但是源码还是用的是手机的。
这里面有个
mHomeRotationEnabled = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,
mActivity.getDeviceProfile().allowRotation);
所以这句话已经把之前那个xml文件的默认值写了,所以在这写才标准。在xml文件里面直接写,只用第一次进去之后才有效果。
if (!mIgnoreAutoRotateSettings) {
if (mSharedPrefs == null) {
mSharedPrefs = Utilities.getPrefs(mActivity);
mSharedPrefs.registerOnSharedPreferenceChangeListener(this);
}
mHomeRotationEnabled = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,
mActivity.getDeviceProfile().allowRotation);
} else {
if (mSharedPrefs != null) {
mSharedPrefs.unregisterOnSharedPreferenceChangeListener(this);
mSharedPrefs = null;
}
}
这个方法的前提就是if (!mIgnoreAutoRotateSettings) {
满足了才把那个preference显示出来。,这里面get的preference就只是那一个主屏是否旋转的preference
下次遇到可以试试宏控改掉CONFIG_MTK_LCM_PHYSICAL_ROTATION="0",三个编译文件里都换掉debug_defconfig,defconfig,lk.mk,
加了GMS包的项目走的launcher是下面这个以及package下面的一起
vendor/google/apps/SearchLauncher
这里面没有的文件就用package里面的效果