安卓系统分屏相关修改思路

安卓系统应用在一些特殊设备时,屏幕显示也会有一些特殊要求;
分屏(一面屏幕内显示两个相同的画面),画面分割等,这里讲述一些基本修改思路和简单实例。

OpenGLES相关修改

首先说下比较简单的修改方式,在frameworks层,通过修改"OpenGLES"相关调用部分,实现渲染合成的画面显示调整(AOSP6.0.1_r1以左右分屏为示例):
找到"frameworks/base/lib/hwui/renderstate/RenderState.cpp"的
void RenderSate::render(const Glop& glop)函数,修改如下:

1) glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr);
	修改为
	glViewport(0, 0, mViewportWidth / 2, mViewportHeight);
    glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr);
	glViewport(mViewportWidth / 2, 0, mViewportWidth / 2, mViewportHeight);
    glDrawElements(mesh.primitiveMode, drawCount, GL_UNSIGNED_SHORT, nullptr);
2) glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices);
   修改为
   glViewport(0, 0, mViewportWidth / 2, mViewportHeight);
   glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices);
   glViewport(mViewportWidth / 2, 0, mViewportWidth / 2, mViewportHeight);
   glDrawElements(mesh.primitiveMode, mesh.elementCount, GL_UNSIGNED_SHORT, indices.indices);
3) glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount);
  修改为
  glViewport(0, 0, mViewportWidth / 2, mViewportHeight);
  glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount);
  glViewport(mViewportWidth / 2, 0, mViewportWidth / 2, mViewportHeight);
  glDrawArrays(mesh.primitiveMode, 0, mesh.elementCount);

实现原理:

void RenderState::setViewport(GLsizei width, GLsizei height) {
    mViewportWidth = width;
    mViewportHeight = height;
    glViewport(0, 0, mViewportWidth, mViewportHeight);
    }
 之前修改图层渲染(LayerRenderer.cpp)时,发现图层变成了左半屏,由此追踪代码,找到这个函数,通过对OpenGL显示窗口的调整及多次调用绘制实现相关功能。

实现思路:

frameworks/base/lib/hwui文件夹内相关文件描述了安卓系统对屏幕渲染的基本思路,缓冲数据在这里处理后写入驱动(部分流数据没有经过这里处理,比如摄像头流),其中包含顶点数据计算、着色器渲染等;
这个示例只能算是参考(至少在效率方面是这样), 具体实现需要对数据缓冲区、着色器等方面进行优化。

画布数据相关修改

画布相关修改比较复杂,但是一些特殊流可以在这里处理...
参考"frameworks/base/core/java/android/view/ViewRootImpl.java"的
private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth,
            int desiredWindowHeight)函数,
 这里可以设置布局的大小,这块研究的比较浅只是简单实现了等比例的宽和高...

本人对于安卓系统分屏、屏幕分割等研究的只能算简单了解,描述一下研究思路吧:

目前我了解的安卓屏幕绘制有两种思路:
1) 修改画布,使其画布在画布层上放置等比例的像素;
2) 修改图像渲染,完成屏幕显示多块化或渲染层内等比例放置渲染像素。

相关参考资料:
<深入解析Android5.0系统>
<OpenGL编程指南第8版>
<浅谈OpenGL、OpenGL ES>

发布了87 篇原创文章 · 获赞 195 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/88412844