Android之Su易做图ceView学习(一)
首先我们先来看下官方API对Su易做图ceView的介绍
Su易做图ceView的API介绍
Provides a dedicated drawing su易做图ce embedded inside of a view hierarchy. You can control the format of this su易做图ce and, if you like, its size; the Su易做图ceView takes care of placing the su易做图ce at the correct location on the screen
The su易做图ce is Z ordered so that it is behind the window holding its Su易做图ceView; the Su易做图ceView punches a hole in its window to allow its su易做图ce to be displayed. The view hierarchy will take care of correctly compositing with the Su易做图ce any siblings of the Su易做图ceView that would normally appear on top of it. This can be used to place overlays such as buttons on top of the Su易做图ce, though note however that it can have an impact on performance since a full alpha-blended composite will be performed each time the Su易做图ce changes.
Access to the underlying su易做图ce is provided via the Su易做图ceHolder inte易做图ce, which can be retrieved by calling getHolder().
The Su易做图ce will be created for you while the Su易做图ceView's window is visible; you should implement su易做图ceCreated(Su易做图ceHolder) and su易做图ceDestroyed(Su易做图ceHolder) to discover when the Su易做图ce is created and destroyed as the window is shown and hidden.
One of the purposes of this class is to provide a su易做图ce in which a secondary thread can render in to the screen. If you are going to use it this way, you need to be aware of some threading semantics:
•All Su易做图ceView and Su易做图ceHolder.Callback methods will be called from the thread running the Su易做图ceView's window (typically the main thread of the application). They thus need to correctly synchronize with any state that is also touched by the drawing thread.
•You must ensure that the drawing thread only touches the underlying Su易做图ce while it is valid -- between Su易做图ceHolder.Callback.su易做图ceCreated() and Su易做图ceHolder.Callback.su易做图ceDestroyed().
对应的中文翻译
Su易做图ceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Su易做图ce。你可以控制这个Su易做图ce的格式和尺寸。Su易做图ceview控制这个Su易做图ce的绘制位置。
su易做图ce是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。su易做图ceview提供了一个可见区域,只有在这个可见区域内 的su易做图ce部分内容才可见,可见区域外的部分不可见。su易做图ce的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 su易做图ce的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果su易做图ce上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。
你可以通过Su易做图ceHolder接口访问这个su易做图ce,getHolder()方法可以得到这个接口。
su易做图ceview变得可见时,su易做图ce被创建;su易做图ceview隐藏前,su易做图ce被销毁。这样能节省资源。如果你要查看 su易做图ce被创建和销毁的时机,可以重载su易做图ceCreated(Su易做图ceHolder)和 su易做图ceDestroyed(Su易做图ceHolder)。
su易做图ceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
1> 所有Su易做图ceView和Su易做图ceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2> 由于su易做图ce可能被销毁,它只在Su易做图ceHolder.Callback.su易做图ceCreated()和 Su易做图ceHolder.Callback.su易做图ceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的su易做图ce。
接下来呢,说说自己对它的理解
1、定义
可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。
它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到Su易做图ceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。
2、实现
首先继承Su易做图ceView并实现Su易做图ceHolder.Callback接口
使用接口的原因:因为使用Su易做图ceView 有一个原则,所有的绘图工作必须得在Su易做图ce 被创建之后才能开始(Su易做图ce—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Su易做图ce 的内容
可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Su易做图ce 被销毁之前必须结束。所以Callback 中的su易做图ceCreated 和su易做图ceDestroyed 就成了绘图处理代码的边界。
需要重写的方法
(1)public void su易做图ceChanged(Su易做图ceHolder holder,int format,int width,int height){}
//在su易做图ce的大小发生改变时激发
(2)public void su易做图ceCreated(Su易做图ceHolder holder){}
//在创建时激发,一般在这里调用画图的线程。
(3)public void su易做图ceDestroyed(Su易做图ceHolder holder) {}
//销毁时激发,一般在这里将画图的线程停止、释放。
整个过程:继承Su易做图ceView并实现Su易做图ceHolder.Callback接口 ----> Su易做图ceView.getHolder()获得Su易做图ceHolder对象 ---->Su易做图ceHolder.addCallback(callback)添加回调函数---->Su易做图ceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->Su易做图ceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。
3、Su易做图ceHolder
这里用到了一个类Su易做图ceHolder,可以把它当成su易做图ce的控制器,用来操纵su易做图ce。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:
(1)、abstract void addCallback(Su易做图ceHolder.Callback callback);
// 给Su易做图ceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。
4、实例
这里的例子实现了一个矩形和一个计时器
View Code
1 package xl.test;
2
3 import android.app.Activity;
4 import android.content.Context;
5 import android.graphics.Canvas;
6 import android.graphics.Color;
7 import android.graphics.Paint;
8 import android.graphics.Rect;
9 import android.os.Bundle;
10 import android.view.Su易做图ceHolder;
11 import android.view.Su易做图ceView;
12
13 public class ViewTest extends Activity {
14 /** Called when the activity is first created. */
15 @Override
16 public void onCreate(Bundle savedInstanceState) {
17 super.onCreate(savedInstanceState);
18 setContentView(new MyView(this));
19 }
20 //视图内部类
21 class MyView extends Su易做图ceView implements Su易做图ceHolder.Callback
22 {
23 private Su易做图ceHolder holder;
24 private MyThread myThread;
25 public MyView(Context context) {
26 super(context);
27 // TODO Auto-generated constructor stub
28 holder = this.getHolder();
29
补充:移动开发 , Android ,