android11 动态设置屏幕旋转方向
1、需求
客户动态设置屏幕的旋转方向,下次开机保持设置的屏幕方向,开关机动画也要跟着旋转。
2、分析
如果开关机动画也要跟着旋转,就不跟再LocalDisplayAdapter.java里面改了,因为开关机动画已经基本走完,需要在SurfaceFlinger.cpp里面改动
3、撸起袖子开干
设置里面添加菜单的流程代码省略,这部分已经有成熟的demo可以参考,我是使用persist.vendor.orientation属性来控制屏幕的显示方向,取值0 90 180 270。
SurfaceFlinger.cpp修改
在processDisplayHotplugEventsLocked里面修改
void SurfaceFlinger::processDisplayHotplugEventsLocked() {for (const auto& event : mPendingHotplugEvents) {const std::optional<DisplayIdentificationInfo> info =getHwComposer().onHotplug(event.hwcDisplayId, event.connection);if (!info) {continue;}+char rotationvalue[PROPERTY_VALUE_MAX] = "";;+property_get("persist.vendor.orientation", rotationvalue, "-1");+int rotation = atoi(rotationvalue);+ALOGI("Primary Display Orientation is set to rotation %2d.", rotation);+switch (rotation) {+ case 0:+ internalDisplayOrientation = ui::ROTATION_0;+ break;+ case 90:+ internalDisplayOrientation = ui::ROTATION_90;+ break;+ case 180:+ internalDisplayOrientation = ui::ROTATION_180;+ break;+ case 270:+ internalDisplayOrientation = ui::ROTATION_270;+ break;+ default:+ break;+}const DisplayId displayId = info->id;const auto it = mPhysicalDisplayTokens.find(displayId);
添加如上代码功能就OK了。
不过中间遇到了俩个问题
1、persist.vendor.orientation 属性设置值失败
android11的权限整的很让人无语,对属性的控制更加严格,我对比了系统里面一些属性配置,发现了debug_prop类型,于是在device/rockchip/sepolicy/private/property_contexts文件中增加
persist.vendor.orientation u:object_r:debug_prop:s0 问题得到解决。
2、设置了旋转方向后,有时候开机方向还是默认方向
logcat看了发现偶尔会读取不到persist.vendor.orientation属性值,一般这种问题都是磁盘分区加密引起的,关闭磁盘分区加密就可以解决。
确认磁盘是否加密方法
adb shell getprop ro.crypto.state
显示encrypted说明已加密,
显示unencrypte说明未加密
关闭磁盘读取加密方法
device/rockchip/common/scripts/fstab_tools/fstab.in
/dev/block/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065 latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,reservedsize=128M,checkpoint=fs
红色标注的内容去掉即可。
4、看到有朋友问屏幕旋转后,有需求TP也要跟着一起旋转,请看补丁代码
Index: TouchInputMapper.cpp
===================================================================
--- TouchInputMapper.cpp (revision 212)
+++ TouchInputMapper.cpp (revision 213)
@@ -22,6 +22,7 @@#include "CursorScrollAccumulator.h"#include "TouchButtonAccumulator.h"#include "TouchCursorInputMapperCommon.h"
+#include <cutils/properties.h>namespace android {@@ -665,6 +666,11 @@int32_t rawHeight = mRawPointerAxes.getRawHeight();bool viewportChanged = mViewport != *newViewport;
+ char rotationvalue[PROPERTY_VALUE_MAX] = "";;
+ property_get("persist.vendor.orientation", rotationvalue, "0");
+ int rotation = atoi(rotationvalue);if (viewportChanged) {mViewport = *newViewport;@@ -674,7 +680,33 @@int32_t naturalPhysicalWidth, naturalPhysicalHeight;int32_t naturalPhysicalLeft, naturalPhysicalTop;int32_t naturalDeviceWidth, naturalDeviceHeight;
- switch (mViewport.orientation) {
+ int currentrotation = DISPLAY_ORIENTATION_0;
+ switch (rotation) {
+ case 0:
+ currentrotation = DISPLAY_ORIENTATION_0;
+ break;
+ case 90:
+ currentrotation = DISPLAY_ORIENTATION_90;
+ break;
+ case 180:
+ currentrotation = DISPLAY_ORIENTATION_180;
+ break;
+ case 270:
+ currentrotation = DISPLAY_ORIENTATION_270;
+ break;
+ default:
+ break;
+ }+ if(currentrotation == DISPLAY_ORIENTATION_0 && mViewport.orientation != currentrotation){
+ rotation = mViewport.orientation;
+ currentrotation = mViewport.orientation;
+ }
+
+ // switch (mViewport.orientation) {
+ switch (currentrotation) {case DISPLAY_ORIENTATION_90:naturalLogicalWidth = mViewport.logicalBottom - mViewport.logicalTop;naturalLogicalHeight = mViewport.logicalRight - mViewport.logicalLeft;
@@ -751,6 +783,25 @@mSurfaceOrientation = DISPLAY_ORIENTATION_0;}}
+ ALOGI("Primary Display Orientation is set to rotation %2d.", rotation);
+ switch (rotation) {
+ case 0:
+ mSurfaceOrientation = DISPLAY_ORIENTATION_0;
+ break;
+ case 90:
+ mSurfaceOrientation = DISPLAY_ORIENTATION_90;
+ break;
+ case 180:
+ mSurfaceOrientation = DISPLAY_ORIENTATION_180;
+ break;
+ case 270:
+ mSurfaceOrientation = DISPLAY_ORIENTATION_270;
+ break;
+ default:
+ break;
+ }// If moving between pointer modes, need to reset some state.bool deviceModeChanged = mDeviceMode != oldDeviceMode;
@@ -3653,13 +3704,13 @@}bool TouchInputMapper::isPointInsideSurface(int32_t x, int32_t y) {
- const float xScaled = (x - mRawPointerAxes.x.minValue) * mXScale;
- const float yScaled = (y - mRawPointerAxes.y.minValue) * mYScale;
-
- return x >= mRawPointerAxes.x.minValue && x <= mRawPointerAxes.x.maxValue &&
- xScaled >= mSurfaceLeft && xScaled <= mSurfaceRight &&
- y >= mRawPointerAxes.y.minValue && y <= mRawPointerAxes.y.maxValue &&
- yScaled >= mSurfaceTop && yScaled <= mSurfaceBottom;
+ //const float xScaled = (x - mRawPointerAxes.x.minValue) * mXScale;
+ //const float yScaled = (y - mRawPointerAxes.y.minValue) * mYScale;
+ //modify fix dual tp with sync display,second tp funtion is error
+ return x >= mRawPointerAxes.x.minValue && x <= mRawPointerAxes.x.maxValue
+ //&& scaledX >= mPhysicalLeft && scaledX <= mPhysicalLeft + mPhysicalWidth
+ && y >= mRawPointerAxes.y.minValue && y <= mRawPointerAxes.y.maxValue;
+ //&& scaledY >= mPhysicalTop && scaledY <= mPhysicalTop + mPhysicalHeight;}const TouchInputMapper::VirtualKey* TouchInputMapper::findVirtualKeyHit(int32_t x, int32_t y) {
android11 动态设置屏幕旋转方向相关推荐
- 在Android的 设置-显示 中增加控制屏幕旋转方向的选项
在Android的 设置->显示 中增加控制屏幕旋转方向的选项 参考博文 实现目标 效果局限 代码实现 配置资源文件 界面搭建 功能实现 默认值修改 其他情况 结语 参考博文 Android-x ...
- 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )
文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...
- [C# 开发技巧系列]如何动态设置屏幕分辨率
原文 http://www.cnblogs.com/zhili/archive/2013/05/23/ChangeResolution.html 因为最近在MSDN论坛和stackflow中看到一些朋 ...
- IOS基础之iPad的屏幕旋转方向判断
IOS基础之iPad的屏幕旋转方向判断 #pragma mark - 屏幕旋转 - (void)viewWillTransitionToSize:(CGSize)size withTransition ...
- linux内核怎么修改屏幕旋转方向_树莓派4—屏幕旋转
配置:树莓派4+raspberry pi系统,HDMI显示,非触屏. 问题:想将屏幕旋转90°,按网上说的, 方法一:在config.txt文件中添加display_rotate=1,或者添加disp ...
- 苹果手机计算机无法横屏,苹果手机怎么设置屏幕旋转失灵了怎么办
苹果手机有个实用小功能之一就是设置屏幕旋转,方便我们看电影时候横放自动旋转为横屏,设置很简单.下面由学习啦小编为你整理了苹果4s屏幕自动旋转在哪里设置的相关方法,希望对你有帮助! 4s屏幕旋转设置的方 ...
- iOS开发 - 设置应用屏幕旋转方向、禁止横屏
前言 最近写软件的 UI 发现,屏幕旋转会影响布局的展示,由于开发的周期比较短,来不及做精细的布局适配,所以我决定禁止应用竖屏展示.处理过程如下文所示,希望对他人也有帮助. 操作步骤 1. 设置 De ...
- iOS - 设置应用屏幕旋转方向、禁止横屏
前言 最近写软件的 UI 发现,屏幕旋转会影响布局的展示,由于开发的周期比较短,来不及做精细的布局适配,所以我决定禁止应用竖屏展示.处理过程如下文所示,希望对他人也有帮助. 操作步骤 1. 设置 De ...
- IOS开发之——手动设置屏幕旋转
在手机开发过程中,你可能会需要你的手机横过来看,有可能是全部界面都要横过来,有可能是当用户把手机横过来的时候,你的界面也想让他横过来,也有可能是只有部分界面需要横着显示的,根据不同的情况,有不同的解决 ...
最新文章
- hdoj_1047_大數加法 java 模擬
- MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】
- [Node.js]get/post请求
- 模板:k短路(可并堆)
- java 字符串文字筛选_拜托,Java。 最终是否支持多行字符串文字
- 单片机c语言应用100例第3版课后答案,单片机C语言应用100例(第3版)(含光盘1张)...
- React-Native 组件开发方法
- 奇怪吸引子---LiuChen
- PHP学习笔记--函数
- FreeSwitch的Canvas功能
- 【ArcGIS教程03】基础知识(建议收藏)
- 【雕爷学编程】Arduino动手做(3)---微波雷达感应开关模块
- 拼多多商品按关键词采集爆款商品
- 简单聊聊OpenWrt的UPnP协议
- 韩波兄的好文:写给过去,现在和未来的自己
- L2+/L3级智能驾驶功能量产,为何说侧向补盲激光雷达是必备传感器?
- Netty学习笔记(一)--- 初识Netty
- win10 运行debussy不能打开波形窗口问题
- 【云和恩墨大讲堂】彭文元 - 中间件BES连接池的配置和问题诊断方法
- 生活娱乐 重庆乡村基挑战肯德基为何失败
热门文章
- linux crontab 每30秒,crontab 每 30 秒自動執行
- 图灵学院 python全栈_图灵学院 Python全系列教程全栈工程师 python视频教程下载
- 【实战】OpenCV+Python项目实战--信用卡数字识别
- Java——获取上传的pdf页数
- Android移动开发-Android设备利用光线传感器监测光照强度的实现
- 运营之光:我的互联网运营方法论与自白学习总结(思维导图)
- 亚马逊云科技荣获2021中国公有云平台用户满意度第一
- 数字图像处理——第三章 灰度变换与空间滤波
- 给定平面上的n个点,求最多有多少个点共线
- el-upload编辑时回显图片