Android 画图方式总结

Android apk 里面的画图分为2D3D两种:2D是由Skia 来实现的,也就是我们在框架图上看到的SGLSGL也会调用部分opengl 的内容来实现简单的3D效果;3D部分是由OpenGL|ES实现的

先了解一下Android apk的几种画图方式,然后再来来看一看这一整套的图形体系是怎么建立的

画图都是对供给应用程序的一块内存进行数据填充,也就是对这块surface内存进行操作,说穿了就是我们要么调用2D API画图,要么调用3DAPI画图,然后将画下来的图保存在这个内存中,最后这个内存里面的内容会被Opengl渲染以后变为可以在屏幕上的像素信

一、2D画图

1Simple Graphics in View

只是把Graphic 资源(imagesshapescolorspre-defined animation等等这些Android已经实现的一些画图操作)放入View体系,由系统 来将这些Graphic画出来。                                              在这里没有一笔一画地构造出一个图形出来,即并没有自己去定义画图操作

而是将这些内容放入View中,由系统来将这些内容画出来。这种方式只能画静态或者极为简单的2D图画,对于实时性很强的动画,高品质的游戏都是没法实现

2Canvas

  这个Canvas是一个2D的概念,是在Skia中定义的。可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap)。这种方式下我们能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。这种方式分为两种。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理 量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图

2.1          View canvas---使用普通Viewcanvas画图

(1) 定义一个自己的View class your_view extends View{} 

(2)  重载ViewonDraw方法:protected void onDraw(Canvas canvas){}
(3) 
onDraw方法中定义你自己的画图操作

除此之外:可以定义自己的Btimap:

Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);//
必须将这个Bitmap放入Viewcanvas中,画的  图才能显示出来

 

 

2.2          Surface View Canvas---使用专门的SurfaceViewcanvas来画图

(1) 定义一个自己的SurfaceView : class your_surfaceview extends SurfaceView  implements SurfaceHolder.Callback() {}

(2)实现SurfaceHolder.Callback3个方法: surfaceCreated()surfaceChanged() surfaceDestroyed() ;

(3) 定义自己的专注于画图的线程  : class your_thread extends Thread()

(4) 重载线程的run()函数  [一般在run中定义画图操作,在surfaceCreated中启动这个线程

(5) 画图的过程一般是这样的

SurfaceHolder surfaceHolder = getHolder() ;   //取得holder,这个holder主要是对surface操作的适配.

surfaceHolder.addCallback(this) ;  //注册实现好的callback

/*---------------------------------画图
/**--------------------------------
画图结束*/
surfaceHolder.unlockCanvasAndPost() ;                //
提交并显示

 

2.3总结2D画图用到的包

 

android.view                   //画图是在View中进行的

android.view.animation         //定义了一些简单的动画效果Tween Animation Frame. Animation

android.graphics                  //定义了画图比较通用的API,比如canvaspaintbitmap

android.graphics.drawable       //定义了相应的Drawable(可画的东西),比如说BitmapDrawablePictureDrawable

android.graphics.drawable.shapes          //定义了一些shape

二、3D画图

针对3D画图SDK上讲得很简单,就是继承一个View,然后在这个View里面获得 Opengl的句柄进行画图,道理和2D一样的,差别就是一个是使用2DAPI画图,一个是使用3D的。

因为3D openGl|ES具有一套本身的运行机制,比如渲染的过程控制等,因此Android提供了一个专门的画图类GLSurfaceView。这个类被放在一个单独的包android.opengl里面,其实现了其他View所不具备的操作:

(1)               画图是在一个专门的Surface上进行, 这个Surface可以最后被组合到androidView体系中

(2)               Opengl的运行周期可以与Activity的生命周期协调

(3)               具有OpenGL|ES调用过程中的错误跟踪,检查工具,方便了Opengl编程过程的debug

(4)               可以根据EGL的配置来选择自己的buffer类型,比如RGB565depth16

(5)               通过render来画图,而且renderOpengl的调用是在一个单独的线程中

  GLSurfaceViewAndroid提供的一个非常值得学习 的类,它实际上是一个如何在View中添加画图线程的例子,如何在Java 中使用线程的例子,如何添加事件队列的例子具体的源码在:/framworks/base/opengl/java/android/opengl/GLSurfaceView.java

GLSurface3D图形的步骤:

(1)      选择画图需要的buffer类型即:EGL配置  setEGLConfigChooser();

(2)      选择是否需要Debug信息

  setDebugFlags(int)
   setGLWrapper(GLSurfaceView.GLWrapper)

3 GLSurfaceView注册一个画图的renderer

setRenderer(GLSurfaceView.Renderer)

(4)   设置render mode:持续渲染或根据命令渲染, setRenderMode(int)

(5)   Opengl的运行和Activity的生命周期绑定在一起, 也就是说Activity pause的时候,opengl的渲染也必须pause。除此之外,GLSurfaceView提供了线程间交互的函数 queueEvent(Runnable),可以用在主线程和render线程之间的交互

   class MyGLSurfaceView extends GLSurfaceView {

     private MyRenderer mMyRenderer;

     public void start() {

         mMyRenderer = ...;

         setRenderer(mMyRenderer);

     }

     public boolean onKeyDown(int keyCode, KeyEvent event) {

         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {

             queueEvent(new Runnable() {

                 // This method will be called on the rendering

                 // thread:

                 public void run() {

                     mMyRenderer.handleDpadCenter();

                 }});

             return true;

         }

         return super.onKeyDown(keyCode, event);

      }

   }

二、AndroidOpengl和Skia的调用层次关系

3.1应用层到底层对skia的调用关系

 

  Androidskia的调用是一个比较经典 的调用过程,应用程序的几个包是在SDK中提供的;JNI放在框架的JNI目录下面的Graphic目录;skia是作为一个第三方组件放在external目录下面。我们可以稍微了解一下skia的结构:

                

 

主要涉及到的3个库:

   libsgl.so        包含/skia/src/core|effects|images|ports|utils的部分和全部内容,这个实现了skia大部分的图形效果,以及图形格式的编解码

  libcorecg.so  包含/skia/src/core的部分内容,比如其中的RegionRect是在SurfaceFlinger里面计算可是区域的操作基本单位

libskiagl.so   包含/skia/src/gl里面的内容,主要用来调用opengl实现部分效果

 

3.2  Android3D的调用

Androidopengl的本地实现,JNIjava接口都放在/frameworks /base/opengl下面,而且它内部还带了一个工具可以生成JNI代码。

                           

 

我们来看看opengl的目录结构:

     /include     包含eglgles所有的头文件

     /java/android/opengl   这个目录包含的就是我们3D画图要使用到的GLSurfaceView

     /java/com/google/android/gles_jni   这个目录包含一些自动生成的文件

     /java/javax/microedition/khronos/egl   这就是应用层使用到的egl接口

     /java/javax/microedition/khronos/opengl  这就是应用层使用到的opengl接口

     /libagl  这个就是opengl主要的实现了

     /libs  这里面包含两个库的实现,一个是libegl.so 还有一个是libGL|ES_CM.so

     /tools  在我的理解这就是一个jni的生成工具

     Opengl编程谁都知道是一个大工程,我觉得现在对3D的需求应该是很低的,很多效果我们使用skia也可以实现。所以我觉得将来的重点应该还是放在skia上面

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/59552.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓手机安装Linux教程 多图

这里是效果 想玩linux,电脑不想装双系统,性能不够跑不了虚拟机,树莓派买不起,怎么办?安卓手机啊 本文就以Nexus 5X(PureNexus 7.1.2)为例,介绍如何在手机上跑Linux,这是…

【Android 应用开发】Android 图表绘制 achartengine 示例解析

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/38420197 一. AChartEngine 简介 1. 项目地址 AChartEngine 简介 : AChartEngine 是 Android 平台的图表开发库, 能绘制 折线图, 饼图, 气泡图, 柱状图, 散点图, 面积图等统计图表; 最新版本…

android之各种图形绘制

Android中绘制图片或形状是我们常遇到的事情,通过最近的学习与在网上学习的案例与资料那么我今天就总结一下android中绘制用到的一些类和方法,其中其中主要包括3个类Canvas,Paint,Bitmap,这里我做的不规范,…

Android 高级绘图

高级画布绘图 我们已经介绍了Canvas,在那里,已经学习了如何创建自己的View。在第7章中也使用了Canvas来为MapView标注覆盖。 画布(Canvas)是图形编程中一个很普通的概念,通常由三个基本的绘图组件组成: Canvas 提供了绘图方法…

Android——(仿微信聊天界面布局实例)

今天看郭霖《第一行代码》书上写了一个聊天窗体的小例子,自己就练习学了一下。加上一些自己的理解整理了一下。 1.第一步首先是制作9.patch图片,这个在android sdk 目录下tools文件,找到draw9patch.bat文件双击打开。这是一个专门用来处理安…

Android MPAndroidChart超漂亮图表框架

Android MPAndroidChart超漂亮图表框架 简介配置示例总结 Blog如有不对,敬请斧正 喜欢Android的可以关注我,日常更新Android干货简介 MPAndroidChart是GitHub中大名鼎鼎的一个开源框架,可以快速制作开发中需要的图表,如:折线图、…

【安卓基础】03 实现简单聊天界面

编写一个简单的聊天界面,例子来自《第一行代码》。 1. 编写主界面 聊天界面使用 RecyclerView,简单来说是谷歌新增的控件,与 ListView 类似,但是功能更加强大。比如 ListView 只能纵向华东,但是 RecyclerView 可以设…

安卓 类微信界面实现

目录 1.引言 2.实现 1.写出顶部和底部的layout 2.主页面 3.写四个fragment用于显示不同的内容 4.写MainActivity中的代码 3.总结 1.引言 这是我第一次接触安卓的开发,因为之前学过c#和java,感觉使用AS开发就像使用java在写winform,同样…

安卓开发之设计微信界面

一、功能需求 完成一个类似微信页面的布局,要求: 页面最上方是标题居中页面中间界面显示内容,内容随下方栏的选择而切换页面最下方有四个按钮点击按钮后,按钮图标会变换颜色,且显示框变换内容 项目大致框架如下&…

干货!几招教你降低论文重复率!!

相信大家已经开始为毕业论文奋战了,甚至有的学校已经答辩结束了。今天,小编就说说史上最奇葩智能系统——知网论文检测系统,并且告诉大家躲避查重的几个大招。 各个学校对所谓论文原创度的标准要求不同,碰到要求重复率在30%或20%以…

最简单的 6 种防止数据重复提交的方法!(干货)

有位朋友,某天突然问磊哥:在 Java 中,防止重复提交最简单的方案是什么? 这句话中包含了两个关键信息,第一:防止重复提交;第二:最简单。 于是磊哥问他,是单机环境还是分布…

如何降重计算机SCI论文的重复率? - 易智编译EaseEditing

介绍几种降重方法: 1“中英中”互换法 用翻译软件先翻译成英文, 再翻译回中文,之后手工修改润色一下, 这样换了一种表达句式,但愿文意思没有改变。 值得一提的是,现在中英文互译软件已经非常强大了&…

对文本文件中出现的词进行次数统计

主要涉及读取文本文件、统计词出现的数目、排序、隐藏函数lambda。 随便从网页复制一篇文章保存成“train.txt”,采用以下代码读取txt文件: def load_stop_words(file "stopwords.txt"):with open(file,"r",encoding"utf-8&…

最简单的6种防止数据重复提交的方法!(干货)

有位朋友,某天突然问磊哥:在 Java 中,防止重复提交最简单的方案是什么? 这句话中包含了两个关键信息,第一:防止重复提交;第二:最简单。 于是磊哥问他,是单机环境还是分布…

马斯克成立人工智能公司X.AI:对抗ChatGPT 已买1万个GPU

雷递网 雷建平 4月15日 根据内华达州的一份文件,特斯拉CEO埃隆马斯克 (Elon Musk) 已经成立了一家名为X.AI Corp的新人工智能公司。马斯克为X.AI Corp的唯一董事,而贾里德伯查尔,马斯克家族办公室的董事则是其秘书。 X.AI已允许出售这家私人持…

十大网络安全上市公司分析,让我们重点聊聊F5

网络安全上市厂商业务广泛分布于网络安全硬件、软件,网络安全服务等板块,总体来看,十大网络安全上市公司的竞争可谓是如火如荼。今天让我们把目光集中在F5,这个能为我们所有人创造更安全的数字世界的企业,在应用及API交…

基于blinker的 microPython 小爱同学

官方没有基于esp8266 esp32的microPython 的SDK 翻了 c源码 照葫芦画瓢画出了 这个 100行左右 里面有个设置设备类型的链接 需要手动设置一次 然后就可以进米家绑定其他设备同步到小爱同学啦 比官方的几百K缩小了很多 不过在官方源码翻协议倒是翻了一晚上。 https://download…

集美大学及集美大学诚毅学院的课表导入小爱同学

引言 由于学校教务系统在使用上存在一定的不便,无法在手机上简单地查看课程表,往往都需要通过截图的形式在手机上保存以供上课过程中查阅。本教程将介绍一种将集美大学及集美大学诚毅学院的课程表导入到小爱同学中的方法。 选择小爱课程表的理由是觉得市…

基于微信小程序的网上订餐系统 报告+任务书+开题报告+文献综述+中期PPT+外文翻译及原文+PPT+项目源码及数据库文件

摘要 随着微信小程序的飞速发展,很多系统随之兴起,微信已经是我们生活中的一部分,可不单单是人们用于沟通聊天的工具。还有很多公告平台、小程序也随之发展。大部分公众平台都只起到了一个信息消息的推送或者浏览的作用,而小程序的…

蚌埠学院教务系统自动导入课程表到小米/Redmi手机小爱同学课程表使用说明

文章目录 蚌埠学院教务系统自动导入课程表到小米/Redmi手机小爱同学课程表详细教学视频演示一、自我介绍二、使用说明1.使用条件2.读入数据 总结and已知问题 蚌埠学院教务系统自动导入课程表到小米/Redmi手机小爱同学课程表 蚌埠学院教务系统自动导入课程表到小米/Redmi手机小…