android屏幕旋转显示流程,android屏幕旋转显示流程

本文详细介绍了Android系统中SurfaceFlinger如何处理屏幕旋转的过程,包括初始化DisplayDevice、设置MTKProperties,以及DisplayDevice的setProjection函数如何根据硬件旋转属性设置显示方向。通过对`ro.sf.hwrotation`属性的读取,确定屏幕的初始旋转角度,并利用Transform矩阵进行实际的旋转操作。

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

PAD默认屏幕显示方向是竖着显示,改成默认横屏显示需要将屏幕的默认显示方向顺时针旋转90度.

android显示系统的核心是surfaceflinger,它为所有的应用程序提供显示服务,它能够将各种应用程序的2D,3D surface进行组合,合并最终得到的一个main surface数据送入framebuffer,显示的翻转和旋转也是由surfaceflinger完成的,我们大致分析下surfaceflinger的旋转流程:

1.surfaceflinger启动后首先进行初始化操作,设置surfaceflinger的相关属性并创建了DisplayDevice对象

void SurfaceFlinger::init() {

...

#ifdef MTK_AOSP_ENHANCEMENT

// make sure 3D init success

if (mEGLContext == EGL_NO_CONTEXT)

{

ALOGE("FATAL: couldn't create EGLContext");

delete mHwc;

eglTerminate(mEGLDisplay);

exit(0);

}

// init properties setting first

setMTKProperties(); //设置MTK相关属性

#else

LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,

"couldn't create EGLContext");

#endif

...

// initialize our non-virtual displays

for (size_t i=0 ; iisConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {

// All non-virtual displays are currently considered secure.

bool isSecure = true;

createBuiltinDisplayLocked(type);

wptoken = mBuiltinDisplays[i];

spproducer;

spconsumer;

BufferQueue::createBufferQueue(&producer, &consumer,

new GraphicBufferAlloc());

spfbs = new FramebufferSurface(*mHwc, i,

consumer);

int32_t hwcId = allocateHwcDisplayId(type);

sphw = new DisplayDevice(this, //初始化各个DisplayDevice对象

type, hwcId, mHwc->getFormat(hwcId), isSecure, token,

fbs, producer,

mRenderEn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值