Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)

本文主要是介绍Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章较长建议先收藏再看

拆解步骤

1、app 强制横屏显示,无视 android:screenOrientation=“portrait” 属性

2、屏幕触摸坐标修改为横屏

3、开机动画横屏

4、开机logo、关机充电动画横屏

5、RecoveryUI 横屏

上代码

##1、app 强制横屏显示

修改 rotationForOrientationLw(), 默认返回 270

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

 @Overridepublic int rotationForOrientationLw(int orientation, int lastRotation, boolean defaultDisplay) {....synchronized (mLock) {...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 Surface.ROTATION_270;//cczheng add for land scap}}}

activity 默认强制属性为 SCREEN_ORIENTATION_LANDSCAPE

frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java

boolean updateOrientationFromAppTokensLocked(int displayId, boolean forceUpdate) {long ident = Binder.clearCallingIdentity();try {final DisplayContent dc = mRoot.getDisplayContent(displayId);// final int req = dc.getOrientation();int req = android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;//cczheng add for land scapif (req != dc.getLastOrientation() || forceUpdate) {if (DEBUG_ORIENTATION) {Slog.v(TAG, "updateOrientation: req= " + req + ", mLastOrientation= "+ dc.getLastOrientation(), new Throwable("updateOrientation"));}dc.setLastOrientation(req);//send a message to Policy indicating orientation change to take//action like disabling/enabling sensors etc.,// TODO(multi-display): Implement policy for secondary displays.if (dc.isDefaultDisplay) {mPolicy.setCurrentOrientationLw(req);}return dc.updateRotationUnchecked(forceUpdate);}return false;} finally {Binder.restoreCallingIdentity(ident);}}

DisPlayContent 显示 mRotation 默认改为 3 (270)

frameworks\base\services\core\java\com\android\server\wm\DisplayContent.java

/*** Current rotation of the display.* Constants as per {@link android.view.Surface.Rotation}.** @see #updateRotationUnchecked()*/// private int mRotation = 0;private int mRotation = 3;//cczheng add for land scap

修改默认值 config_reverseDefaultRotation 为 true,翻转显示角度

frameworks\base\core\res\res\values\config.xml

<!-- If true, the direction rotation is applied to get to an application's requestedorientation is reversed.  Normally, the model is that landscape isclockwise from portrait; thus on a portrait device an app requestinglandscape will cause a clockwise rotation, and on a landscape device anapp requesting portrait will cause a counter-clockwise rotation.  Settingtrue here reverses that logic. --><!-- cczheng add for land scap --><bool name="config_reverseDefaultRotation">true</bool> <!-- The number of degrees to rotate the display when the keyboard is open.A value of -1 means no change in orientation by default. --><!-- cczheng add for land scap --><integer name="config_lidOpenRotation">270</integer>

2、屏幕触摸坐标修改为横屏

对调 frame 的宽和高,设置方向为 270

frameworks\native\services\surfaceflinger\DisplayDevice.cpp


void DisplayDevice::setProjection(int orientation,const Rect& newViewport, const Rect& newFrame) {Rect viewport(newViewport);Rect frame(newFrame);const int w = mDisplayWidth;const int h = mDisplayHeight;Transform R;DisplayDevice::orientationToTransfrom(orientation, w, h, &R);if (!frame.isValid()) {// the destination frame can be invalid if it has never been set,// in that case we assume the whole display frame.//cczheng add for land scap// frame = Rect(w, h);if (w < h)frame = Rect(h, w);elseframe = Rect(w, h);}....}// clang-format off
DisplayDevice::DisplayDevice(const sp<SurfaceFlinger>& flinger,DisplayType type,int32_t hwcId,bool isSecure,const wp<IBinder>& displayToken,const sp<ANativeWindow>& nativeWindow,const sp<DisplaySurface>& displaySurface,std::unique_ptr<RE::Surface> renderSurface,int displayWidth,int displayHeight,bool hasWideColorGamut,const HdrCapabilities& hdrCapabilities,const int32_t supportedPerFrameMetadata,const std::unordered_map<ColorMode, std::vector<RenderIntent>>& hwcColorModes,int initialPowerMode).....mHdrCapabilities = HdrCapabilities(types, maxLuminance, maxAverageLuminance, minLuminance);// initialize the display orientation transform.// setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);//cczheng add for land scapsetProjection(DisplayState::eOrientation270, mViewport, mFrame);
#ifdef MTK_SF_DEBUG_SUPPORTmFps = FpsCounterLoader::getInstance().create();
#endif
}

frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp

void SurfaceFlinger::onInitializeDisplays() {// reset screen orientation and use primary layer stackVector<ComposerState> state;Vector<DisplayState> displays;DisplayState d;d.what = DisplayState::eDisplayProjectionChanged |DisplayState::eLayerStackChanged;d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];d.layerStack = 0;//d.orientation = DisplayState::eOrientationDefault;//cczheng add for land scapd.orientation = DisplayState::eOrientation270;d.frame.makeInvalid();d.viewport.makeInvalid();d.width = 0;d.height = 0;displays.add(d);....
}

3、开机动画横屏

对调 createSurface() 的 w 和 h

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;// create the native surface/*sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);*///cczheng add for land scap  [S]sp<SurfaceControl> control;if(dinfo.w < dinfo.h)control = session()->createSurface(String8("BootAnimation"),dinfo.h, dinfo.w, PIXEL_FORMAT_RGB_565);elsecontrol = session()->createSurface(String8("BootAnimation"),dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);//cczheng add for land scap  [E]SurfaceComposerClient::Transaction t;t.setLayer(control, 0x40000000).apply();.....}

开机动画制作替换后面补充。。。

4、开机logo、关机充电动画横屏

开机logo定义屏幕分辨率以对应资源文件夹的位置为

vendor\mediatek\proprietary\bootable\bootloader\lk\project\xxxx.mk 没有则看下面的

device\mediateksample\xxxx\ProjectConfig.mk

mk 中的 BOOT_LOGO = wxga

对应的资源文件位置在 vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/wxga

可以看到 wxga 中都是竖屏的图片,而 wxganl 中已经是横屏的图片

ubWkNt.png

则我们将 BOOT_LOGO 修改为 wxganl 即可

接下来还需要继续修改显示的角度,依旧改成 270,不然会出现花屏的现象

开机第一张图片 uboot 对应显示

vendor\mediatek\proprietary\bootable\bootloader\lk\platform\mt6765\mt_logo.c

void init_fb_screen()
{.....// in JB2.MP need to allign width and height to 32 ,but jb5.mp needn'tphical_screen.needAllign = 1;phical_screen.allignWidth = ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT);/* In GB, no need to adjust 180 showing logo ,for fb driver dealing the change *//* but in JB, need adjust it for screen 180 roration           */phical_screen.need180Adjust = 0;   // need sync with chip driverdprintf(INFO, "[lk logo: %s %d]MTK_LCM_PHYSICAL_ROTATION = %s\n",__FUNCTION__,__LINE__, MTK_LCM_PHYSICAL_ROTATION);if (0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "270", 3)) {phical_screen.rotation = 270;} else if (0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "90", 2)) {phical_screen.rotation = 90;} else if (0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3) && (phical_screen.need180Adjust == 1)) {phical_screen.rotation = 180;} else {phical_screen.rotation = 270;//cczheng add for land scap}....

开机第二张图片 kernel 对应显示

vendor\mediatek\proprietary\external\libshowlogo\charging_animation.cpp

int anim_fb_init(void)
{.....phical_screen.needAllign = 1;phical_screen.need180Adjust = 1;phical_screen.fb_size = fb_size;if (MTK_LOG_ENABLE == 1) {SLOGD("[libshowlogo: %s %d]MTK_LCM_PHYSICAL_ROTATION = %s\n",__FUNCTION__,__LINE__, MTK_LCM_PHYSICAL_ROTATION);}if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "270", 3)){phical_screen.rotation = 270;} else if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "90", 2)){phical_screen.rotation = 90;} else if(0 == strncmp(MTK_LCM_PHYSICAL_ROTATION, "180", 3) && (phical_screen.need180Adjust == 1)){phical_screen.rotation = 180;} else {phical_screen.rotation = 270;//cczheng add for land scap}if (MTK_LOG_ENABLE == 1) {SLOGD("[libshowlogo]phical_screen: width= %d,height= %d,bits_per_pixel =%d,needAllign = %d,allignWidth=%d rotation =%d ,need180Adjust = %d\n",phical_screen.width, phical_screen.height,phical_screen.bits_per_pixel, phical_screen.needAllign,phical_screen.allignWidth, phical_screen.rotation, phical_screen.need180Adjust);SLOGD("[libshowlogo: %s %d]show old animtion= 1, running show_animationm_ver %d\n",__FUNCTION__,__LINE__, show_animationm_ver);SLOGD("[libshowlogo: %s %d]draw_anim_mode = 1, running mode %d\n",__FUNCTION__,__LINE__, draw_anim_mode);}return 0;
}

如果出现充电动画图片错位的现象,多数都是因为图形绘制点和屏幕尺寸不匹配导致的。可通过调整 cust_display.h 中位置参数

Android M 后:/vendor/mediatek/proprietary/external/libshowlogo/cust_display.h

Android M 前: /vendor/mediatek/proprietary/bootable/bootloader/lk/target/${PROJECT}/include/target/cust_display.h

(1 ,使用old version动画方案的调整如下设置,

#define BAR_LEFT (215)
#define BAR_TOP (156)
#define BAR_RIGHT (265)
#define BAR_BOTTOM (278)
可以用windows的画图软件打开第1点里提到的图片,根据电池边框的像素来调整。

这里坐标的参考原点是左上角,背景图片的左上角是(0,0),这四个值都是相对于左上角的坐标来确定的,因此RIGHT > LEFT,BOTTOM > TOP
小技巧:1)打开画图软件,选择 查看->缩放->自定义,将图片放到到800%
2)选择 查看->缩放->显示网格
这样就可以看到一个一个的像素
(2,使用new version动画方案调整如下设置:

#define CAPACITY_LEFT (278) 
#define CAPACITY_TOP (556)
#define CAPACITY_RIGHT (441)
#define CAPACITY_BOTTOM (817)

5、RecoveryUI 横屏

参考之前写的文章 MTK Recovery 模式横屏修改(适用于6.0 + 8.1+9.0)

6、系统导航栏位置调整,横屏后 navigationBarPosition 默认在左边

作为平板项目,需要将位置改为底部,直接修改 navigationBarPosition() 返回 NAV_BAR_BOTTOM

frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java

@NavigationBarPositionprivate int navigationBarPosition(int displayWidth, int displayHeight, int displayRotation) {//cchzneg annotaion for land scape/*if (mNavigationBarCanMove && displayWidth > displayHeight) {if (displayRotation == Surface.ROTATION_270) {return NAV_BAR_LEFT;} else {return NAV_BAR_RIGHT;}}*/return NAV_BAR_BOTTOM;}

这样位置是变为底部了,但是三个按钮都重叠在一起了,需要修改 SystemUI 的布局显示

在这里插入图片描述

vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\statusbar\phone\NavigationBarView.java

private void updateRotatedViews() {//cczheng change rot0 rot90 for landscapemRotatedViews[Surface.ROTATION_0] =mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot90);// mRotatedViews[Surface.ROTATION_180] = findViewById(R.id.rot0);mRotatedViews[Surface.ROTATION_270] =mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot0);// mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot90);        updateCurrentView();}

顺带再调整下 NavigationBarView 的默认高度和左边 Back 键区域太大的问题

vendor\mediatek\proprietary\packages\apps\SystemUI\src\com\android\systemui\statusbar\phone\NavigationBarInflaterView.java

private View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater) {View v = null;String button = extractButton(buttonSpec);if (LEFT.equals(button)) {//cchzheng change NAVSPACE to MENU_IME for small left back click areaString s = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, MENU_IME_ROTATE/*NAVSPACE*/);button = extractButton(s);} else if (RIGHT.equals(button)) {String s = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME_ROTATE);button = extractButton(s);}...

frameworks\base\core\res\res\values\dimens.xml

 <!-- Height of the bottom navigation / system bar. --><!--cczheng change 48dp to 30dp--><dimen name="navigation_bar_height">30dp</dimen>

ok,这样就大功告成了,完美的横屏适配

在这里插入图片描述

这篇关于Android9.0 MTK 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095501

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk