Android Display 及强制横竖屏实现

本文详细探讨了Android系统中屏幕管理的核心组件,包括SurfaceFlinger和DisplayManagerService的工作原理,以及它们如何处理屏幕配置、旋转和全屏问题。通过解析LogicalDisplay与LocalDisplayDevice的区别,揭示了屏幕旋转背后的机制。
部署运行你感兴趣的模型镜像
  • 整体框架

Android SurfaceFlinger中Display部分

Android Framework 中Display 部分

--DisplayManagerService对display的管理

--WindowManagerService对Display的管理

Android系统转屏问题

 

Android SurfaceFlinger中的Display部分

SurfaceFlinger用于获取显示屏相关信息。

SurfaceFlinger用HWC机制处理display信息。HWC是Android新版本引入的新模块,可能是替换掉早期的OverLayer机制,提供出全新的使用硬件合成的功能

HWComposer_hwc1.cpp类queryDisplayProperties方法用于查询显示屏的相关的参数,如显示屏宽度高度刷新率、是否连接等等显示屏的相关参数保留在mDisplayData[disp]变量

 

Android Framework 中Display 部分

DisplayManagerService

DisplayManagerService用于拿到已经存在的显示屏相关信息。

DisplayManagerService由systemserver启动,在其onStart函数中会发送MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER消息;这个消息会被registerDefaultDisplayAdapter函数处理,用于创建LocalDisplayAdapter对象,在adapter对象的registerLocked函数中,系统会去尝试连接两种显示屏幕built in(默认屏,如手机中默认的MIPI屏跟HDMI(扩展屏),tryConnectDisplayLocked主要用于从SurfaceFlingergetDisplayConfigs 中获取显示屏的所有支持的配置参数及正在使用的参数,并且创建并配置新的LocalDisplayDevice对象,然后通过DISPLAY_DEVICE_EVENT_ADDED消息告知DMS有新的显示设备添加DMS(addLogicalDisplayLocked)会去处理消息,并且会去创建一个新的LogicalDisplay

 

在最开始,LogicalDisplay会使用与LocalDisplayDevice同样的显示屏配置信息。同时会为这个LogicalDisplay设备分配displayId 与layerStack,sf会把相同layerStack值的图层composer在一起,丢给display去显示。

 

LocalDisplayDevice是真实存在,是一块实实在在的显示设备,不可改变,有具体的宽度,高度等信息。LogicalDisplay是表象,是能够依托于LocalDisplayDevice,并且能更改的。

 

 

LocalDisplayDevice类的configureDisplayInTransactionLocked方法,可以控制屏幕旋转。把orientation变量强制设为指定值,即可实现。

  • 全屏问题

   PhoneWindowManager类的rotationForOrientationLw方法,强制返回1,可以全屏;否则,非全屏显示。

 

  • 旋转问题

   

   LogicalDisplay。LogicalDisplay是界于真实显示设备相关类(DisplayDevice)与WMS中抽象的显示类(DisplayInfo)中间的类。

   LogicalDisplay类中的configureDisplayInTransactionLocked方法用于控制设备信息的旋转角度及宽高。修改其中的orientation变量值,即可控制旋转方向。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>好的,我需要处理用户关于展讯平台在Android11上修改横竖屏显示的请求。首先,用户希望找到解决方案或代码示例来设置屏幕方向。根据用户提供的引用内容,他们提到了修改OrientationEventListener.java文件,特别是针对QQ应用的调整。这可能涉及到传感器方向的检测和处理。 接下来,我需要回忆Android中屏幕方向控制的常见方法。通常,可以通过AndroidManifest.xml中的activity属性设置,或者使用setRequestedOrientation方法动态调整。但用户可能希望更深层次的修改,比如系统级的调整,特别是在展讯平台上。用户提供的代码示例是在OrientationEventListener类中添加了针对QQ应用的逻辑,调整了orientation的值。这可能意味着展讯平台需要特定的代码修改来处理方向问题,尤其是在传感器数据与显示方向不一致时。我需要考虑展讯平台的特殊性。不同的芯片厂商可能有不同的硬件抽象层实现,修改传感器数据或显示方向可能需要调整HAL层或Framework层的代码。例如,在OrientationEventListener中修改方向值,或者在显示服务中调整旋转逻辑。 此外,用户可能需要代码示例。我需要确保提供的代码符合Android11的API,并且适用于展讯平台。可能的代码包括在Activity中设置方向,或者修改系统服务中的相关方法。 还需要注意用户提到的自动旋转后方向不正确的问题。这可能涉及到传感器校准、方向计算的算法,或者应用特定包名的处理,如用户示例中的QQ包名检查。 最后,生成相关问题需要考虑用户可能的后续需求,比如性能分析、优化方法、应用场景等,但需要结合屏幕方向修改的主题,例如其他厂商平台的适配、动态调整方向的注意事项等。</think>在展讯平台Android 11系统中修改横竖屏显示,主要通过以下三种方式实现: ### 一、应用层控制 在AndroidManifest.xml中声明Activity方向: ```xml <activity android:name=".MyActivity" android:screenOrientation="landscape"/> ``` 动态修改方向代码: ```java // 强制横屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // 允许自动旋转 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); ``` ### 二、框架层修改 针对展讯平台的特殊处理(参考示例中的方向修正逻辑): ```java // frameworks/base/core/java/android/view/OrientationEventListener.java public abstract class OrientationEventListener { public void onSensorChanged(SensorEvent event) { // 展讯平台特殊修正 if (isSprdPlatform()) { orientation = (orientation + 90) % 360; } // 原有处理逻辑 } } ``` ### 三、驱动层适配 在显示驱动中设置默认方向(需要内核代码): ```c // kernel/drivers/gpu/drm/sprd/drm_sprd_display.c static void sprd_set_default_rotation(struct drm_crtc *crtc) { struct sprd_crtc *sprd_crtc = to_sprd_crtc(crtc); // 设置默认旋转方向为横屏 sprd_crtc->rotation = DRM_MODE_ROTATE_90; } ``` [^1]: 修改方向检测逻辑时需要特别注意传感器坐标系与屏幕坐标系的对应关系,不同平台可能存在差异
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值