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 动态设置屏幕旋转方向相关推荐

  1. 在Android的 设置-显示 中增加控制屏幕旋转方向的选项

    在Android的 设置->显示 中增加控制屏幕旋转方向的选项 参考博文 实现目标 效果局限 代码实现 配置资源文件 界面搭建 功能实现 默认值修改 其他情况 结语 参考博文 Android-x ...

  2. 【Android RTMP】NV21 图像旋转处理 ( 问题描述 | 图像顺时针旋转 90 度方案 | YUV 图像旋转细节 | 手机屏幕旋转方向 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 图像格式与 Camera图像传感器方向问题 二. NV21 图像格式视频旋转 1. 图像旋转问题及解决方案 ( 顺时针旋转 90 度 ) 2. NV ...

  3. [C# 开发技巧系列]如何动态设置屏幕分辨率

    原文 http://www.cnblogs.com/zhili/archive/2013/05/23/ChangeResolution.html 因为最近在MSDN论坛和stackflow中看到一些朋 ...

  4. IOS基础之iPad的屏幕旋转方向判断

    IOS基础之iPad的屏幕旋转方向判断 #pragma mark - 屏幕旋转 - (void)viewWillTransitionToSize:(CGSize)size withTransition ...

  5. linux内核怎么修改屏幕旋转方向_树莓派4—屏幕旋转

    配置:树莓派4+raspberry pi系统,HDMI显示,非触屏. 问题:想将屏幕旋转90°,按网上说的, 方法一:在config.txt文件中添加display_rotate=1,或者添加disp ...

  6. 苹果手机计算机无法横屏,苹果手机怎么设置屏幕旋转失灵了怎么办

    苹果手机有个实用小功能之一就是设置屏幕旋转,方便我们看电影时候横放自动旋转为横屏,设置很简单.下面由学习啦小编为你整理了苹果4s屏幕自动旋转在哪里设置的相关方法,希望对你有帮助! 4s屏幕旋转设置的方 ...

  7. iOS开发 - 设置应用屏幕旋转方向、禁止横屏

    前言 最近写软件的 UI 发现,屏幕旋转会影响布局的展示,由于开发的周期比较短,来不及做精细的布局适配,所以我决定禁止应用竖屏展示.处理过程如下文所示,希望对他人也有帮助. 操作步骤 1. 设置 De ...

  8. iOS - 设置应用屏幕旋转方向、禁止横屏

    前言 最近写软件的 UI 发现,屏幕旋转会影响布局的展示,由于开发的周期比较短,来不及做精细的布局适配,所以我决定禁止应用竖屏展示.处理过程如下文所示,希望对他人也有帮助. 操作步骤 1. 设置 De ...

  9. IOS开发之——手动设置屏幕旋转

    在手机开发过程中,你可能会需要你的手机横过来看,有可能是全部界面都要横过来,有可能是当用户把手机横过来的时候,你的界面也想让他横过来,也有可能是只有部分界面需要横着显示的,根据不同的情况,有不同的解决 ...

最新文章

  1. hdoj_1047_大數加法 java 模擬
  2. MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】
  3. [Node.js]get/post请求
  4. 模板:k短路(可并堆)
  5. java 字符串文字筛选_拜托,Java。 最终是否支持多行字符串文字
  6. 单片机c语言应用100例第3版课后答案,单片机C语言应用100例(第3版)(含光盘1张)...
  7. React-Native 组件开发方法
  8. 奇怪吸引子---LiuChen
  9. PHP学习笔记--函数
  10. FreeSwitch的Canvas功能
  11. 【ArcGIS教程03】基础知识(建议收藏)
  12. 【雕爷学编程】Arduino动手做(3)---微波雷达感应开关模块
  13. 拼多多商品按关键词采集爆款商品
  14. 简单聊聊OpenWrt的UPnP协议
  15. 韩波兄的好文:写给过去,现在和未来的自己
  16. L2+/L3级智能驾驶功能量产,为何说侧向补盲激光雷达是必备传感器?
  17. Netty学习笔记(一)--- 初识Netty
  18. win10 运行debussy不能打开波形窗口问题
  19. 【云和恩墨大讲堂】彭文元 - 中间件BES连接池的配置和问题诊断方法
  20. 生活娱乐 重庆乡村基挑战肯德基为何失败

热门文章

  1. linux crontab 每30秒,crontab 每 30 秒自動執行
  2. 图灵学院 python全栈_图灵学院 Python全系列教程全栈工程师 python视频教程下载
  3. 【实战】OpenCV+Python项目实战--信用卡数字识别
  4. Java——获取上传的pdf页数
  5. Android移动开发-Android设备利用光线传感器监测光照强度的实现
  6. 运营之光:我的互联网运营方法论与自白学习总结(思维导图)
  7. 亚马逊云科技荣获2021中国公有云平台用户满意度第一
  8. 数字图像处理——第三章 灰度变换与空间滤波
  9. 给定平面上的n个点,求最多有多少个点共线
  10. el-upload编辑时回显图片