本篇博客是记录自己解决开机动画与系统方向不一致方案代码,思路:在系统参数根目录自定义persist.sys.hwrotationxrd=0来作为动画方向,当修改系统方向时同时修改这个参数,当系统启动加载动画时在根据这个来旋转动画方式以保证动画方式与系统方式一致。
实现步骤如下:
一、在rk3288\device\rockchip\rk3288\system.prop 内创建persist.sys.hwrotationxrd=0 与屏幕主屏默认方式一致
二、在rk3288\frameworks\base\cmds\bootanimation\BootAnimation.cpp 内修改动画方式
status_t BootAnimation::readyToRun() {
mAssets.addDefaultAssets();
......
DisplayInfo dinfo;
status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
if (status)
return -1;
// create the native surface
// int curWidth = dinfo.w;
// int curHeight = dinfo.h;
// if(mShutdown && mReverseAxis){
// curWidth = dinfo.h;
// curHeight = dinfo.w;
// }
//start add super
char hwrotationaa[PROPERTY_VALUE_MAX];
property_get("persist.sys.hwrotationxrd",hwrotationaa,"0");
ALOGE("hwrotation::%s" , hwrotationaa);
int orient = atoi(hwrotationaa)/90;
sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
(orient ==1 || orient==3) ?dinfo.h:dinfo.w,
(orient ==1 || orient==3) ?dinfo.w:dinfo.h, PIXEL_FORMAT_RGB_565);
// sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
// dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
if(orient == 1 || orient == 3){
Rect destRect(dinfo.h, dinfo.w);
mSession->setDisplayProjection(dtoken,orient,destRect,destRect);
}
ALOGE("eliot BootAnimation::readyToRun22222222 add end\n");
//end add super
......
三、在rk3288\frameworks\native\services\surfaceflinger\DisplayDevice.cpp 内初始化动画方向
// Name the display. The name will be replaced shortly if the display
// was created with createDisplay().
switch (mType) {
case DISPLAY_PRIMARY:
mDisplayName = "Built-in Screen";
break;
case DISPLAY_EXTERNAL:
mDisplayName = "HDMI Screen";
break;
default:
mDisplayName = "Virtual Screen"; // e.g. Overlay #n
break;
}
//start add super
int defaultOrientation = 0;
char property[PROPERTY_VALUE_MAX];
property_get("persist.sys.hwrotationxrd", property, "0");
defaultOrientation = atoi(property);
switch(defaultOrientation) {
case 0:
defaultOrientation = DisplayState::eOrientationDefault;
break;
case 90:
defaultOrientation = DisplayState::eOrientation90;
break;
case 180:
defaultOrientation = DisplayState::eOrientation180;
break;
case 270:
defaultOrientation = DisplayState::eOrientation270;
break;
default:
defaultOrientation = DisplayState::eOrientationDefault;
break;
}
// initialize the display orientation transform.
setProjection(defaultOrientation, mViewport, mFrame);
//end add super
// initialize the display orientation transform.
// setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
#ifdef NUM_FRAMEBUFFER_SURFACE_BUFFERS
surface->allocateBuffers();
#endif
}
四、上层修改动画方向
1、rk3288\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager 修改
.....
//add start 2024-8-2
private int mDefaultOrientation = Surface.ROTATION_0;
@Override
public void setInitialDisplaySize(Display display, int width, int height, int density) {
// This method might be called before the policy has been fully initialized
// or for other displays we don't care about.
if (mContext == null || display.getDisplayId() != Display.DEFAULT_DISPLAY) {
return;
}
....
// Only force the default orientation if the screen is xlarge, at least 960dp x 720dp, per
// http://developer.android.com/guide/practices/screens_support.html#range
mForceDefaultOrientation = longSizeDp >= 960 && shortSizeDp >= 720 &&
res.getBoolean(com.android.internal.R.bool.config_forceDefaultOrientation) &&
// For debug purposes the next line turns this feature off with:
// $ adb shell setprop config.override_forced_orient true
// $ adb shell wm size reset
!"true".equals(SystemProperties.get("config.override_forced_orient"));
//start add super
String defaultOrientation = SystemProperties.get("persist.sys.hwrotationxrd", "0");
if("0".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_0;
} else if("90".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_90;
} else if("180".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_180;
} else if("270".equals(defaultOrientation)) {
mDefaultOrientation = Surface.ROTATION_270;
} else {
mDefaultOrientation = Surface.ROTATION_0;
}
//end add super
}
.....
@Override
public int rotationForOrientationLw(int orientation, int lastRotation) {
switch (orientation) {
case ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
// Return portrait unless overridden.
if (isAnyPortrait(preferredRotation)) {
return preferredRotation;
}
return mPortraitRotation;
case ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
// Return landscape unless overridden.
if (isLandscapeOrSeascape(preferredRotation)) {
return preferredRotation;
}
return mLandscapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
// Return reverse portrait unless overridden.
if (isAnyPortrait(preferredRotation)) {
return preferredRotation;
}
return mUpsideDownRotation;
case ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
// Return seascape unless overridden.
if (isLandscapeOrSeascape(preferredRotation)) {
return preferredRotation;
}
return mSeascapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
case ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE:
// Return either landscape rotation.
if (isLandscapeOrSeascape(preferredRotation)) {
return preferredRotation;
}
if (isLandscapeOrSeascape(lastRotation)) {
return lastRotation;
}
return mLandscapeRotation;
case ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
case ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT:
// Return either portrait rotation.
if (isAnyPortrait(preferredRotation)) {
return preferredRotation;
}
if (isAnyPortrait(lastRotation)) {
return lastRotation;
}
return mPortraitRotation;
default:
// For USER, UNSPECIFIED, NOSENSOR, SENSOR and FULL_SENSOR,
// just return the preferred orientation we already calculated.
if (preferredRotation >= 0) {
return preferredRotation;
}
// return Surface.ROTATION_0;
return mDefaultOrientation;// add modify 2024-8-2
}
}
}
2、rk3288\frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java 修改
private WindowManagerService(Context context, InputManagerService inputManager,
boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore) {
......
//add start 2024-8-2
String defaultOrientation = SystemProperties.get("persist.sys.hwrotationxrd", "0");
if("0".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_0;
} else if("90".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_90;
} else if("180".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_180;
} else if("270".equals(defaultOrientation)) {
mRotation = Surface.ROTATION_270;
} else {
mRotation = Surface.ROTATION_0;
}
//add end 2024-8-2
}
到此修改就完成了,本文是参照Android 高通7.1系统默认横屏显示(无G-sensor)_高通 android7 横竖屏显示-CSDN博客
修改完成,感谢!
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Android 高通7.1系开机动画自动跟随系统方向旋转
发表评论 取消回复