canvas教程

Android绘图必杀技

字号+ 作者:H5之家 来源:H5之家 2016-09-16 12:00 我要评论( )

Android绘图必杀技-Canvas跟Drawables 2016-09-13 11:54 | 98人阅读 | 来源 Android绘图必杀技---Canvas和Drawables 原文自: Android框架提供一系列2D绘画API,它允许你在画布上渲染自定义的图像和定制已经存在的视图的外型与体验。当绘制2D图像时,你将会

Android绘图必杀技-Canvas跟Drawables

2016-09-13 11:54 | 98人阅读 | 来源

Android绘图必杀技---Canvas和Drawables

 

原文自:

 

Android框架提供一系列2D绘画API,它允许你在画布上渲染自定义的图像和定制已经存在的视图的外型与体验。当绘制2D图像时,你将会使用代表性的两种方法:
a.* 通过布局在视图对象里绘制你的图像或者动画* 。这种方法,你的图像句柄被系统标准视图层绘制进程控制。你简单定义将图像插入视图中。
b.* 直接在画布上绘制图像* 。此方法,你要亲自调用相应类的onDraw()方法 (passing it your Canvas), 或者其中一个画布draw开头的方法(比如drawPicture())。这样做,你还:在控制任意的动画。
在你绘制简单图像时,方法a是最好的选择。它不需要不断改变也不属于高性能游戏。比如,你在视图中想要绘制静态的或者预先确定的动画在另外的静态应用中。更多信息请查看Drawables。
当你的应用需要规律性的在画布上重绘时,方法b更为合适。就像电子游戏,你要自己重绘画布。然而,我们还有其他方法来实现:
* 在UI Activity的同一线程里创建的自定义视图组建中,调用invalidate()再控制onDraw()回调.
* 或者,在单独的线程中, 管理一个SurfaceView并在画布中绘图(你不需要请求invalidate())。

当你开发一个应用专门来完成绘制和控制图像的动画,你应该使用画布。画布工作机制就像一个接口,你表面图像将会被绘制。它控制所有绘画调用。通过画布,隐藏的位图(Bitmap)v完成了绘图。它被放在窗体里。
在onDraw()的回调方法事件中绘图,你只需要调用画布即可。当处理SurfaceView对象时,你也可以从SurfaceHolder.lock Canvas()获取一个画布。(所有这些场景将在下面的章节中讨论。)然而,你需要创建一个新的画布,你必须定义一个实际执行的位图Bitmap。这个位图Bitmap是画布所必须的。你可以像这样设置一个新画布:
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
现在你的画布将绘制你定义的位图Bitmap。你还可以将这个位图Bitmap移到另外一个画布,使用Canvas.drawBitmap(Bitmap,...)方法。通过View.onDraw()或SurfaceHolder.lockCanvas()获得画布绘制图像的方法是值得推荐的。(请看下面章节).
Canvas类有自己的设置绘画方法。像drawBitmap(...), drawRect(...), drawText(...)等等。你会用到的其他类也会有draw()方法。比如,你有可能有一些Drawable对象需要放到画布中。Drawable有自己的draw()方法,并将Canvas作为参数。

* View 绘图*

如果你的应用不需要大量的处理或者帧速率(或许是一个棋类游戏,贪吃蛇,或者其他),你应该考虑创建一个自定义的View组件并通过View.onDraw()在画布中绘制。Android框架提供了预定义的Canvas来完成绘图调用,这么做是最方便的。
首先, 继承View类(或者其子类)并且定义onDraw()回调方法。这个方法在接到Android框架绘图请求时被调用。通过onDraw()回调执行所有画布绘图方法。
Android框架必须只调用onDraw()方法。每时每刻你的应用准备被绘制,你必须调用invalidate()使View无效。这表面你将会看到你的View被绘制,Android将会随即调用你的onDraw()方法(尽管不能保证实时的回调)。
在你的View组件onDraw()里,使用画布进行所有的绘制,使用各种Canvas.draw...()方法,或者其他类的draw()方法他们以Canvas作为参数。当onDraw()完成后,Android框架使用你的Canvas绘制位图Bitmap由系统控制.

* 注意: 为了从一个非主Activity的线材请求invalidate,你必须调用postInvalidate()) .

继承View类的信息,请看自定义组件。
对于一个简单的应用程序,请看贪吃蛇, 在SDK案例文件: /samples/Snake/.

* SurfaceView 绘图*

SurfaceView是View的一个特殊的子类,提供一个专用的绘图表面,在View层。应用程序的次级线材中加入绘制, 这样应用就不需要等到View层绘制完才能被请求。而且,副线程引用的SurfaceView可以绘制和控制自己的画布。
首先,你要创建一个SurfaceView的子类。这个类同时要实现SurfaceHolder.Callback。这个接口将反馈你底层的信息,比如什么时候创建,改变或者销毁。知道这些事件非常重要,你可以知道什么时候开始绘制,你是否需要对新外观属性的进行调整,和当你停止绘制并销毁一些任务。在SurfaceView类是定义副线程的好地方,它执行画布的所有绘制过程。
你应该通过SurfaceHolder,而非直接控制Surface对象。这样,当你的SurfaceView初始化,通过getHolder()获得SurfaceHolder。通知SurfaceHolder你要接收SurfaceHolder回调(SurfaceHolder.Callback)通过addCallback()。在SurfaceView class里覆盖所有SurfaceHolder.Callback方法。
为了在副线程中绘制界面画布,你必须传递线程到SurfaceHandler并且通过lockCanvas()获得画布。你现在可以通过SurfaceHolder获得画布并且在上面绘图了。当你在画布上绘制时, 调用unlockCanvasAndPost() ,传递到你的Canvas对象中。界面现在将绘制这个画布只要你关闭它。执行一系列的加锁解锁在你每次想要重绘时。

注: 在每次你从SurfaceHolder获得画布时,Canvas之前的状态将会被保留。为了绘制正确的动画效果,你必须重绘所有的界面。比如,你可以通过填充颜色drawColor()来清除画布之前的状态,或者由drawBitmap()设置背景图片。否则,你将会看到之前执行的痕迹。

关于程序例子,请看登月者游戏,在SDK例子目录下: /samples/LunarLander/。或者,在案例代码篇章浏览源代码。

Android为图形图像提供自定义2D图像处理库。你可以在android.graphics.drawable包里找到针对二位绘图的公共类。
本篇章讨论使用Drawable对象绘图的基础,和如何使用Drawable类的多个子类。使用Drawables来绘制帧动画,请看Drawable Animation。

Drawable的基本含义是内容是可绘的,你会发现Drawable类被扩展用于各种各样的可绘制图像,包括BitmapDrawable, ShapeDrawable, PictureDrawable, LayerDrawable等等。当然,你也可以继承它们来定义自己的Drawable对象。

有三种方法定义和实例化一个Drawable:使用项目资源中的图像;使用XML文件定义Drawable属性;或者使用一般的类构造函数。下面,我们将讨论前面两种方法(使用构造函数并没有什么新颖的地方)。

* 由资源图像创建*

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Android好奇宝宝

    Android好奇宝宝

    2016-09-05 11:00

  • 基于HTML5 canvas绘图技术研究.pdf.pdf

    基于HTML5 canvas绘图技术研究.pdf.pdf

    2016-09-04 18:00

  • Android的Paint、Canvas和Matrix讲解

    Android的Paint、Canvas和Matrix讲解

    2016-09-02 13:00

  • android jni 用skia画图,运行后模拟器上没显示,求解啊

    android jni 用skia画图,运行后模拟器上没显示,求解啊

    2016-09-02 12:00

网友点评