Android图形框架简介

 

一、Android图形框架简介
    Android图形框架可分为两部分:用于应用程序图形UI显示的上层View体系和用于图形渲染的底层图形驱动,可用下图表示
    

      如图,View/GLSurfaceView体系就是用于构建Application UI的图形控件;而Skia与OpenGL | ES则是实际进行图形渲染的图形驱动,其中,Skia是2D图形库,而OpenGL | ES则是2D/3D图形库。Canvas可以看做是View与Skia之间的一个接口,其实它就是一套2D图形API,供Application进行2D图形绘制。
 
二、Android图形框架的具体应用
    在Android中,图形系统由2D图形库Skia和2D/3D图形库OpenGL | ES来驱动。
    对于3D图形库OpenGL | ES来说,从Android1.0开始,就已经支持OpenGL ES 1.0和1.1,从Android 2.2开始,实现了对OpenGL ES 2.0的支持;从Android 3.0开始,系统又新增了android.renderscript包及相关技术来支持3D图形渲染。
 
    与2D图形相关的几个包有:android.graphics.drawable、android.view、  
        android.view.animation、android.graphics、android.graphics.drawable.shapes。
 
    与3D图形相关的几个包有:
    android.opengl
    javax.microedition.khronos.egl
    javax.microedition.khronos.opengles。
 
    不同的应用场景,需要用到的图形技术是不同的,比如,如果您的应用程序仅仅需要绘制一些相对静态的图形及简单动画,可能2D图形技术就能够满足您的需求;如果您的程序是一个交互式的游戏动画等,可能就得需要使用3D图形技术了。
 
1、2D图形绘制
 在Android中,绘制2D图形,有两种方式:
 1)利用系统中View体系提供的标准View控件
      我们知道,Android中,绘制UI的方式之一就是利用系统预定义的各种标准View控件,如TextView、ImageView、ButtonView、ListView等进 
      行2D图形绘制。
      如果程序只是需要用到一些静态的图片及预定义的动画,那么这种方式就能满足需求。
 
 2)利用系统提供的2D图形接口类Canvas
      如果方式1)满足不了2D图形绘制的需求,那么就可以考虑使用该种方式。
      当程序需要绘制一些自定义的图形或动画时,可能就需要使用Canvas 提供的更为灵活的方法来实现。
      Canvas类提供了一组绘图API,如drawBitmap、drawRect、drawText等,通过这些基本的绘图API,我们就可以绘制各种自定义的图形。当然,通
      过Canvas类的绘图API绘制的图形最终都需要应用到View对象上才能显示出来。
     使用Canvas进行2D图形绘制有两种方式:
     A、从View类派生出自己的View类(On a View)
          如果应用程序并不需要一个高帧率的处理过程,比如象棋游戏、贪 吃蛇游戏等慢速游戏,那么就可以使用这种方式来实现一个自定义的图形绘制。
          这种方式的典型步骤是:
        (1)定义一个自己的View:class MyView extends View{}
        (2)重载View类的onDraw()方法:public:void onDraw(Canvas){}
        (3)在onDraw方法中利用Canvas的绘图接口定义自己的绘图操作

   B、从SurfaceView类派生出自己的SurfaceView类(On a SurfaceView)
        该种方式与A的区别是,SurfaceView的图形绘制是在一个单独的线程中完成的,而A中的图形绘制是在UI线程(与Activity同线程)中完成的。
        这样,图形的 绘制就可以独立于UI线程而进行,当进行复杂图形或动画的绘制时,就不会阻塞UI线程了。
       这种方式的典型步骤是:
      (1)定义一个自己的SurfaceView:class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback(){}
      (2)实现SurfaceHolder.Callback()接口的三个方法:surfaceCreated() 、surfaceChanged() 、surfaceDestroyed()。
      (3)定义自己的绘图线程:class MyThread extends Thread{}
      (4)重载绘图线程的Run函数。
       一般在run中定义绘图操作,在SurfaceCreate中启动这个线程。
 
 绘图的过程一般如下:
       SurfaceHolder surfaceHolder = getHolder() ;         
       surfaceHolder.addCallback(this)                                     
        Canvas canvas = surfaceHolder.lockCanvas() ;    
       //具体的绘图操作..............................
       surfaceHolder.unlockCanvasAndPost() ;             
 
2、3D图形绘制
      Android通过两种方式来实现对3D图形API OpenGL ES的支持,一个是Android框架API,另一个就是NDK。
     1)Android框架API
          Android框架为应用程序的开发提供了两个类来实现对3D图形API  OpenGL ES的支持,分别是GLSurfaceView和GLSurfaceView.Renderer。
          通过这两个接口类,我们就可以基于OpenGL ES来进行3D图形的开发了。
          详细开发介绍可见另一篇文章《Android OpenGL编程之第一个例子》。
 
    2)NDK
          该种方式其实和1)类似,只是NDK会将GLSurfaceView.Renderer的实现部分放到本地来实现,然后通过JNI来实现JAVA端和C端的通信。
          使用NDK来实现的主要原因就是提高效率,因为图形渲染部分被放到本地利用C/C++来实现了。

你可能感兴趣的:(Java/Android)