`
wen742538485
  • 浏览: 241102 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android图形系统详解一:Canvas

阅读更多
http://blog.csdn.net/nkmnkm/article/details/7405504
概述
  当写一个应用时,恰当的决定你的图形需求是很重要的.不同的图形任务对应不同的技术.例如,一个静态应用的图形和动画的实现肯定与一个交互式游戏非常不同.这里,我们将讨论一些在android上绘制图形时的操作以及它们最适合应用的任务.

Canvas和Drawables

  Android提供了一系列View部件来为大多数用户界面提供通常的功能.你也可以扩展这些部件来修改它们的外观和行为.另外,你可以使用Canvas类的方法来绘制你自己的2D显示或为那些像纹理按钮或逐帧显示的动画之类的东西或创建Drawable对象.

硬件加速

  从Android3.0开始,你可以硬加速大多数以CanvasAPI完成的绘画工作来大幅提高它们的性能.

OpenGL

  Android支持OpenGLES 1.0和2.0,Android框架API和(NDK)都同样支持.在CanvasAPI不支时使用框架API添加一些图形增强功能是被推荐的或者你不在意高性但期望是平台无关的.使用框架API比NDK性能要低,所以对于很多图形交互应用比如游戏,使用NDK是最好的(重点注意尽管你使用框架API依然获得足够的性能.比如,Google主体应用是全用框架API开发的).当你的有很多原生代码要移植到android时NDK中的OpenGL还是很有用处的.

Canvas
  Android框架APIs提供了一系列2D绘画APIs使你可以在一个canvas上画出你自己的图形或修改已存在的View来定制它们的外观.当画2D图形时,典型情况下,你将使用以下两方法之一:

a.把你的图形或动画绘制到你的layout中的一个View上.你的图形的绘制被系统的标准View绘制过程所处理— 你只需定义进入View的图形即可.

b.在一个Canvas中直接绘制图形.用此方法,你需亲自调用恰当的类的onDraw()方法(把它传给你的Canvas),或Canvas的draw...()方法们中的一个(比如drawPicture()).在这样做时,你也可以任意控制动画.

选项"a,"画到View上,是当你想画不需动态改变的简单图形并且不是高性能要求游戏的一部分时的最佳的选择.例如,你应该在你想显示一个静态图形或预先定义的动画时画到View上.



选项"b,"画到Canvas上,当你的应用需要定期地重画自己时是更好的选择.像视频游戏这样的应用应画到Canvas上,有不止一种方法来这样做:

在你的UIActivity线程中,你创建一个自定义View组件,然后调用invalidate()然后处理onDraw()回调.

或者,在不同的线程中,你管理一个SurfaceView并且以最快的可能速度执行向Canvas绘画的动作(你不需要执行invalidate()).

用Canvas绘画
  当你正在写一个应用,在其中你想执行特殊的绘画并且/或者控制图形动画,你应该使用Canvas作画.一个其实只是一个中间层,只是一个接口,它代表了实际的图形绘制到的表面— 它承受了所有的绘画调用.通过Canvas,你的绘制实际执行到一个后台Bitmap上,这个Bitmap被放在窗口中.



  在响应绘画事件的onDraw()回调方法中,提供给你了Canvas,于是你只需把你的绘制调用传给它就行了.当处理一个SurfaceView对象时,你可以从SurfaceHolder.lockCanvas()获取一个Canvas.然而,如果你需要创建一个新的Canvas,那么你必须定义实际绘制所在的Bitmap.Bitmap是Canvas永远所需要的.你可以像下面这样创建一个新的Canvaslike this:

Bitmap b =Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

Canvas c =new Canvas(b);



  现在你的Canvas将画到所定义的Bitmap上.使用Canvas画完后,你可以使用任一个Canvas.drawBitmap(Bitmap,...)方法把你的Bitmap移到另一个Canvas.推荐你最终还是使用View.onDraw()或SurfaceHolder.lockCanvas()提供给你的Canvas作画.


  Canvas类有很多绘制方法可以使用,比如drawBitmap(...),drawRect(...),drawText(...)等等.也有其它类也具有draw()方法.例如,你有一个Drawable对象要放到Canvas上,Drawable具有它自己的draw()方法,你只需把你的Canvas作为一个参数传给这个方法即可.

画到View
  如果你的应用不需要大量的处理运算或保证帧率(可能是一个棋类游戏,一个贪吃蛇游戏或其它慢动画的应用),那么你应考虑创建一个自定义的View组件然后在它的View.onDraw()中使用Canvas绘制.这样做的方便之处是Android框架将提供给你一个预定义好的Canvas.


  要这样做,从View派生(或从其子孙派生)然后定义onDraw()回调方法.这个方法将被Android框架调用,要求你的View画出它自己的样子.这是你使用Canvas执行所有绘制动作的地方.



  Android框架将仅在需要时才调用onDraw().每次你的应用准备好被绘制时,你必须调用invalidate()来请求你的View无效.这表明了你想让你的View被绘制于是Android将调用你的onDraw()方法(尽管这不能保证回调方法会被立即执行).


  在你的View组件的onDraw()中,使用给你的Canvas来进行所有的绘制工作:使用各种Canvas.draw...()方法,或把你的Canvas作为参数调用其它类的draw()方法.一旦你的onDraw()结束,Android框架将使用你的Canvas来画一个Bitmap,Bitmap被系统管理.



  注:为了在主Acitivity所在线程之外的线程请求view无效,你必须调用postInvalidate().



  可以去SDK例程目录:<your-sdk-directory>/samples/Snake/中看贪吃蛇游戏例子.

画到SurfaceView
  SurfaceView是View的一种特殊子类,它在View派生树中提供一个专门的绘画接口,其目的是把这个绘画接口提供给一个应用的第二个线程,于是应用不需等待系统的View派生类准备好作画再进行其它工作,而是另外的线程引用了一个SurfaceView,SurfaceView可以按自己的速度画到自己的Canvas上.



  要使用它,你首先要从SurfaceView派生创建一个新的类.这个类要实现SurfaceHolder.Callback回调接口.这个接口将把后台表面的信息通知给你,比如当表面被创建,改变或销毁.这些事件都是很重要的,因为你可以从它们知道何时你可以开始作画,你是否需要根据新表面的属性进行调整,和什么时候应该停止绘画并且可能要杀死一些任务.在你的SurfaceView类中也是定义你的第二个线程类的好地方,这个线程类将执行所有对你的Canvas的作画过程.



  你应该通过一个SurfaceHolder来操作你的表面对象而不是直接操作它.所以,当你的SurfaceView初始化后,通过调用getHolder()获取SurfaceHolder.你然后还应该调用addCallback()(把this传给它)来通知SurfaceHolder你想接收SurfaceHolder回调(从SurfaceHolder.Callback).最后在你的SurfaceView类中重写SurfaceHolder.Callback的每一个方法.


  为了在你的第二个线程中画到表面的Canvas上,你必须把你的SurfaceHandler传给第二线程并且用lockCanvas()获取Canvas.你现在可以用Canvas做画了.一旦你完成了绘画,调用unlockCanvasAndPost(),把你的Canvas对象传给它,现在,表面将按你给它的来绘制Canvas.每次你想作画,就执行这个canvas加锁和解锁的步骤.


  注:每次你从SurfaceHolder取得Canvas,Canvas的上一次的状态将保留.你必须每次都完全重画你的表面.例如,你可以通过drawColor()填充颜色或通过drawBitmap()设置一个背景图像来清空Canvas的上一次状态.否则,你将会看到你上次作画的痕迹.


我看例子,可以去看LunarLander游戏,在SDKsamples 文件夹下:<your-sdk-directory>/samples/LunarLander/.或者,浏览在SampleCode一文只浏览源码(尚未出此章,敬请期待).
分享到:
评论

相关推荐

    Android canvas drawBitmap方法详解及实例

    在Android开发中,Canvas是用于在屏幕上绘制图形和图像的核心组件。`drawBitmap()`方法是Canvas的一个关键函数,用于在Canvas上绘制Bitmap图像。本文将深入解析`drawBitmap()`方法的参数及其用法,并通过实例来说明...

    android利用Paint在Canvas上实现竖排写字

    在Android开发中,Canvas是用于在屏幕上绘制图形和文本的核心组件。Paint对象则是用来设置绘制样式,如颜色、字体、线宽等。本教程将详细讲解如何利用Paint和Canvas在Android应用中实现在竖直方向上写字。 1. **...

    Android多媒体应用开发实战详解:图像、音频、视频、2D和3D

    《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》是一本针对Android平台多媒体开发的详尽指南,旨在帮助Android程序员、研发人员以及对此领域感兴趣的爱好者掌握核心技能,从基础到高级,从理论到实践...

    源码

    `Paint`对象是Android图形系统中另一个重要的组成部分,它允许我们控制文本的外观。你可以设置`Paint`的颜色、字体大小、样式(如粗体或斜体)、抗锯齿效果以及更多其他属性。 例如,如果你想要在屏幕中心绘制红色...

    android应用开发详解

    《Android应用开发详解》这本书是为初学者量身打造的一本指南,旨在深入浅出地介绍Android应用开发的各个环节。Android开发是一个庞大且复杂的领域,涵盖了许多不同的技术和工具,但本书将带你逐步走进这个领域,从...

    《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》

    《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》是一本深入探讨Android平台上多媒体应用开发的专业书籍。这本书详细介绍了如何利用Android系统提供的API和技术,来实现图像处理、音频播放与录制、视频...

    canvas简单实例详解

    这个“canvas简单实例详解”将带你深入了解Canvas的基本用法和常见操作,为你的网页开发添加丰富的视觉效果。 一、Canvas基本结构 Canvas元素在HTML中以`&lt;canvas&gt;`标签表示,可以通过ID来引用并进行JavaScript操作...

    Android入门到精通详解(完整书签)

    #### 第一篇:Android系统结构和SDK使用 ##### 第1章:Android的系统介绍 - **系统介绍**:Android是Google开发的一款基于Linux平台的开源操作系统,专为移动设备设计。它包含了操作系统、中间件以及一系列标准...

    Android_图形系统分析-surfaceFlinger流程

    SurfaceFlinger作为Android图形系统的核心组件之一,负责管理屏幕上的多个显示层,并控制它们的合成与渲染,以确保用户界面流畅、高效地显示。本文将深入解析SurfaceFlinger的工作原理及其实现机制,帮助读者更好地...

    Android应用开发详解

    12. **动画与图形**:Android提供了丰富的动画API,包括属性动画、视图动画等,以及Canvas和OpenGL ES用于绘制自定义图形。 13. **测试与调试**:单元测试、集成测试和UI测试都是保证应用质量的关键。书中会介绍...

    android应用开发详解 郭宏志编著 pdf格式

    - **Android的架构**:详解Android系统的层次结构,包括Linux内核层、系统运行环境层、应用框架层和应用层。 - **Android生态系统**:阐述Android设备市场占有率、应用商店(Google Play)及其对开发者的意义。 **...

    Android SDK类库

    - **android.graphics**:Canvas对象是绘制图形的核心,它提供了一系列绘图操作方法。Paint对象则用来设置画笔的颜色、粗细等属性,使得绘制效果更加多样化。 - **android.database**:SQLiteOpenHelper类是创建和...

    Canvas详解及代码绘制安卓机器人

    Canvas是Android系统中用于2D图形绘制的核心组件,它提供了丰富的功能来在屏幕上画出各种形状、图像和文字。在Android应用开发中,Canvas经常被用来实现自定义视图、动画效果以及游戏画面等。本篇文章将深入解析...

    Android应用开发详解 源码(12-17章)

    这一章讲解了Android中的数据存储方式,包括SharedPreferences、文件系统、ContentProvider以及SQLite数据库。重点在于SQLite的使用,如创建数据库、表,执行SQL查询,以及事务处理。源码实例可以帮助开发者掌握如何...

    《Android创意实例详解》源代码

    《Android创意实例详解》源代码是一份非常宝贵的资源,它为Android开发者提供了丰富的实践案例,帮助读者深入理解和应用Android开发技术。这份源代码涵盖了多个关键的Android开发知识点,包括但不限于用户界面设计、...

    Android SurfaceFlinger详解

    1. **Surface**:在Android图形系统中,Surface是一个重要的概念。它是用于绘制视图(如TextView、Button等)的基础载体。每个视图都需通过Surface进行绘制。 2. **Canvas**:每个Surface都会创建一个或多个Canvas...

    Android-framework详解

    - **Zygote进程**:Android系统的第一个进程,负责启动后续的所有进程。 - **启动流程**:从Zygote进程开始,经过SystemServer的启动、服务初始化等步骤,最终完成系统的完全启动。 5. **GWES (Graphics Window ...

Global site tag (gtag.js) - Google Analytics