安卓系统应用在一些特殊设备时,屏幕显示也会有一些特殊要求;
分屏(一面屏幕内显示两个相同的画面),画面分割等,这里讲述一些基本修改思路和简单实例。
首先说下比较简单的修改方式,在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、OpenGL ES>