Android Display 及强制横竖屏实现

本文详细探讨了Android系统中屏幕管理的核心组件,包括SurfaceFlinger和DisplayManagerService的工作原理,以及它们如何处理屏幕配置、旋转和全屏问题。通过解析LogicalDisplay与LocalDisplayDevice的区别,揭示了屏幕旋转背后的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 整体框架

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变量值,即可控制旋转方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值