Android 高通7.1系开机动画自动跟随系统方向旋转
本篇博客是记录自己解决开机动画与系统方向不一致方案代码,思路:在系统参数根目录自定义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 superchar 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 #nbreak;}//start add superint 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_BUFFERSsurface->allocateBuffers();
#endif
}
四、上层修改动画方向
1、rk3288\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager 修改
.....//add start 2024-8-2private int mDefaultOrientation = Surface.ROTATION_0;@Overridepublic 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#rangemForceDefaultOrientation = 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 superString 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}.....@Overridepublic 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-2String 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系开机动画自动跟随系统方向旋转
本篇博客是记录自己解决开机动画与系统方向不一致方案代码,思路:在系统参数根目录自定义persist.sys.hwrotationxrd0来作为动画方向,当修改系统方向时同时修改这个参数,当系统启动加载动画时在根据这个来旋转动画方式以保证动画方…...
Sentinel入门与进阶:微服务流量控制的最佳实践 ( 三 )
5.配置持久化 目前的sentinel,无法满足我们生产环境的需求,因为一旦sentinel-dashboard发生重启,限流规则也会随之丢失。 sentinel规则的持久化: Sentinel自身就支持了多种不同的数据源来持久化规则配置,比如文件配置࿰…...
2021年上半年网络工程师考试上午真题
2021年上半年网络工程师考试上午真题 网络工程师历年真题含答案与解析 第 1 题 以下关于RISC和CISC计算机的叙述中,正确的是( )。 (A) RISC不采用流水线技术,CISC采用流水线技术(B) RISC使用复杂的指令,CISC使用简…...
SQL触发器的级联魔力:数据完整性的守护者
标题:SQL触发器的级联魔力:数据完整性的守护者 在SQL的丰富世界中,触发器(Trigger)是一种特殊的存储过程,它能够自动执行响应数据库中的数据修改事件。而级联操作(Cascade)则是触发…...
ARCGIS PRO 要素标注背景色透明度的设置
使用ArcGIS Pro 设置标注背景色的透明度 一、点击标注属性 二、点击符号、注释 三、下拉框选择背景 四、背景符号 五、点击颜色 六、编辑颜色 七、应用...
探讨MySQL中 “约束“ 下的查询
目录: 一. 数据库约束 二. 表的设计 三. 聚合查询 四.联合查询 一. 数据库约束: 1.约束类型汇总: 约束类型 说明 NULL约束使用NOT NULL指定列不为 空UNIQUE唯一约束指定列为唯一的、不重复的DEFAULT默认值约 …...
Nuxt3【布局】layouts 详解
Nuxt 内置布局框架,用法如下: 修改 app.vue <template><NuxtLayout><NuxtPage /></NuxtLayout> </template>NuxtLayout 为 Nuxt 的内置组件,默认加载 layouts/default.vue ,若页面中指定了布局&…...
获取数据源(多种方式爬虫介绍)
获取不同类型的数据源: 对于看上的网站如何获取其信息: 1.分析原网站是如何获取到这些数据的?哪个接口?哪些参数? 2.用程序去调用接口(python/java都可以) 3.处理一些数据,优化数…...
Linux下FTP服务器搭建配置:vsftpd的安装与配置实验
文章目录 vsftpd的安装与配置指南1. vsftpd的安装2. vsftpd配置详解3. 匿名访问测试4. 本地用户访问FTP的配置5. 修改匿名用户和本地用户的默认根目录6. 黑名单与白名单的使用7. 使用Windows文件资源管理器登录8. 拓展FTP的使用场景9. 注意事项 vsftpd的安装与配置指南 本文详…...
使用Java调用Apache commons-text求解字符串相似性实战
目录 前言 一、字符串距离的几种计算方法 1、Levenshtein 距离 2、Overlap Coefficient计算 3、Q-gram Matching 4、余弦相似性计算 二、基于余弦相似性的基地名称对比 1、加载百科中的基地信息列表 2、设置忽略词列表 3、将数据库地名和Excel进行对比 三、总结 前言…...
http request-01-XMLHttpRequest XHR 简单介绍
http 请求系列 http request-01-XMLHttpRequest XHR 简单介绍 http request-01-XMLHttpRequest XHR 标准 Ajax 详解-01-AJAX(Asynchronous JavaScript and XML)入门介绍 Ajax XHR 的替代方案-fetch Ajax XHR 的替代方案-fetch 标准 Ajax 的替代方案…...
关于tresos Studio(EB)的MCAL配置之DIO
General Dio Development Error Detect开发者错误检测 Dio Flip Channel Api翻转通道电平接口Dio_FlipChannel是否启用 Dio Version Info Api决定Dio_GetVersionInfo接口是否启用,一般打开就行。 Dio Reverse Port Bits让端口的位(通道)进…...
【漫谈C语言和嵌入式003】1394总线
1394总线(FireWire或IEEE 1394)是一种高速串行总线标准,最初由苹果公司开发,并在1995年被IEEE(电气与电子工程师协会)批准为国际标准。它最初的目标是提供一种高性能、低延迟的数据传输方法,用于…...
python爬虫爬取某图书网页实例
文章目录 导入相应的库正确地设置代码的基础部分设置循环遍历遍历URL保存图片和文档全部代码即详细注释 下面是通过requests库来对ajax页面进行爬取的案例,与正常页面不同,这里我们获取url的方式也会不同,这里我们通过爬取一个简单的ajax小说…...
Linux 用户管理的基本概念、常用工具及操作流程
😀前言 本篇博文是关于Linux 中用户管理的基本概念、常用工具及操作流程,并提供了一些实用的示例和注意事项。希望这些内容能帮助读者在日常工作中更加高效地管理 Linux 系统的用户账户,希望你能够喜欢🥰 🏠个人主页&a…...
手撕C++入门基础
1.C介绍 C课程包括:C语法、STL、高阶数据结构 C参考文档:Reference - C Reference C 参考手册 - cppreference.com cppreference.com C兼容之前学习的C语言 2.C的第一个程序 打印hello world #define _CRT_SECURE_NO_WARNINGS 1 // test.cpp // …...
NPM版本控制策略:实现版本候选行为的指南
引言 在现代JavaScript项目中,依赖管理是确保应用稳定性和安全性的关键环节。NPM(Node Package Manager)作为Node.js的包管理器,提供了一套灵活的版本控制机制,允许开发者精确控制依赖包的版本。版本候选行为…...
问题集锦6
1.外调外围接口数据库没有变化 我已经修改完发到线上,看调用用代码释放更新了 or 自己掉测试环境试下 handledList 2.list每次写入最前面 List<Integer> snew ArrayList<>();s.add(1);s.add(2);s.add(0,0);System.out.println(s);3.集合 List<Inte…...
【研发日记】嵌入式处理器技能解锁(四)——TI C2000 DSP的Memory
文章目录 前言 背景介绍 Memory映射 RAM ROM 外设Register Memory分配 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见《…...
Ubuntu离线安装docker
查看操作系统版本: rootzyh-VMware-Virtual-Platform:~/install# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04 LTS Release: 24.04 Codename: noble rootzyh-VMware-Virtual-Platform:~/install#…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...
组合模式:构建树形结构的艺术
引言:处理复杂对象结构的挑战 在软件开发中,我们常遇到需要处理部分-整体层次结构的场景: 文件系统中的文件与文件夹GUI中的容器与组件组织结构中的部门与员工菜单系统中的子菜单与菜单项组合模式正是为解决这类问题而生的设计模式。它允许我们将对象组合成树形结构来表示&…...
