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

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>

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

  1. lg分屏软件支持linux吗,LG V10全部软件支持分屏模式修改教程

    LG V10系列手机原生ROM的一大特色当然是可以支持应用分屏啦.当然这不是所有应用都能支持的,也就是说仅仅只支持一些本身已经定义的软件.大家一定都想让LG V10的分屏功能支持所有应用,那么今天安软 ...

  2. android手机可以分屏么,安卓手机怎么分屏操作 安卓手机分屏操作设置教程

    相信很多朋友在用手机看视频或者玩游戏聊天以及参加一些应付考试等等的时候,都会想能不能同时打开多个界面,其实是可以的,只是因为很多时候手机的分屏功能没有被大家所重视,分屏操作支持大家同时打开多个界面,与 ...

  3. win10分屏快捷键无法使用_如何使用Windows10系统分屏快捷键?

    Windows10系统分屏快捷键如何使用?有时候需要记住一些快捷键,能方便我们高效地工作.Windows10系统相较于其他系统增加了很多功能,比如虚拟桌面,分屏功能,小娜功能等等.现在办公我们都是使用 ...

  4. linux系统学习笔记6——debian系统分屏操作(亲测)

    debian系统分屏 刚插上HDMI链接屏幕后,发现两个屏幕是复制的效果 `步骤` xrandr | grep connecteda 1.查看现有的屏幕型号 由上图可以看到,一个是eDP-1 分辨率1 ...

  5. android车载系统分屏功能,超级方便:安卓7.0开启分屏功能有捷径

    IT之家讯 5月19日消息,谷歌在I/O大会上放出了Android N新的开发者预览版,相较之前的版本并没有带来大的功能改进,但相信正式版最终放出时还会有更多功能添加. Android N新增的一项重 ...

  6. android 分屏模式适配,安卓适配分屏注意事项

    分屏模式下可强制应用横屏,所以注意应用内强制竖屏的页面适配横屏显示 分屏模式下,获取应用所占用的宽高 getResources().getConfiguration().screenWidthDp g ...

  7. android4.4系统 分屏,基于Android系统的宽屏后视镜分屏方法及系统与流程

    本发明涉及后视镜应用系统领域,尤其涉及一种基于Android系统的宽屏后视镜分屏方法及系统. 背景技术: 后视镜是驾驶员坐在驾驶室座位上直接获取汽车后方.侧方和下方等外部信息的工具.为了驾驶员操作方便 ...

  8. 服务器系统 分屏,linux下终端分屏使用的两种方法(screen和tmux)

    本文主要介绍两种终端分屏工具:screen和tmux,分享出来供大家参考学习,下面来看看详细的介绍: 一.使用screen分屏(只能上下分屏,不能左右分屏) (1)安装工具 在ubuntu系统中使用s ...

  9. 安卓Unity分屏设置

    1.安卓分屏设置 1Camera 1Canvas :分2个UIPanel(1个作为上部份 1个作为下部份) 2.Camera设置

最新文章

  1. torch 常用函数
  2. Java 设计模式之观察者模式
  3. python做一个记事本_python如何自制一个简易记事本?
  4. 使用MVC框架中要注意的问题(二):将Model和Controller单独用一个项目设计
  5. 查看linux网络带宽
  6. Anaconda安装,linux操作系统学习
  7. mfc c++string、char与char*之间的关系
  8. 网站优化:测试网站速度的8款免费工具推荐
  9. 【综述笔记】一些弱监督语义分割论文
  10. 招聘网站分析-前程无忧网站的爬虫设计与实现
  11. 地震点、火点和气候数据收集
  12. 数控技能大赛计算机程序设计员,第八届全国数控技能大赛决赛获奖名单
  13. modelsim 安装路径存在空格导致不能正常使用
  14. h.265系列快速操作指南_H2O-快速指南
  15. 基于python Flask搭建mockServer服务
  16. 线上bug检测工具 android,Android 测试中对于偶现且难以重现的 bug 的处理
  17. 【c语言作业-二维数组】编写程序,求一个给定的n阶方阵的鞍点。
  18. IIS配置Web服务
  19. adminlTE的简单介绍和使用
  20. python控制手机拨号_Appium+Python-模拟手机按键操作

热门文章

  1. spring:我是如何解决循环依赖的?
  2. 系统架构性能优化思路
  3. 七步从AngularJS菜鸟到专家(7):Routing
  4. Groovy全攻略--嵌入篇
  5. ResNet Keras实现
  6. mavenspringboot项目打包引入lib目录下jar包
  7. 如果正确看待区块链这一新型技术的未来发展?...
  8. 你不懂js系列学习笔记-类型与文法- 02
  9. iOS NSURLSession DataTask(数据任务)
  10. 转换汇编到shellcode的过程