Su易做图ceView,Su易做图ceHolder,Su易做图ceHolder.CallBack
Su易做图ceView 教程
Su易做图ceView介绍
通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外的线程中去(防止阻塞当前UI线程的操作和绘制)。但是在其他线程中却不能修改UI元素,例如用后台线程更新自定义View(调用View的在自定义View中的onDraw函数)是不允许的。
如果需要在另外的线程绘制界面、需要迅速的更新界面或则渲染UI界面需要较长的时间,这种情况就要使用Su易做图ceView了。Su易做图ceView中包含一个Su易做图ce对象,而Su易做图ce是可以在后台线程中绘制的。Su易做图ce属于OPhone底层显示系统,关于这方面的介绍请参考附录中的资料[1]。Su易做图ceView的性质决定了其比较适合一些场景:需要界面迅速更新、对帧率要求较高的情况。使用Su易做图ceView需要注意以下几点情况:
Su易做图ceView和Su易做图ceHolder.Callback函数都从当前Su易做图ceView窗口线程中调用(一般而言就是程序的主线程)。有关资源状态要注意和绘制线程之间的同步。
在绘制线程中必须先合法的获取Su易做图ce才能开始绘制内容,在Su易做图ceHolder.Callback.su易做图ceCreated() 和Su易做图ceHolder.Callback.su易做图ceDestroyed()之间的状态为合法的,另外在Su易做图ce类型为SURFACE_TYPE_PUSH_BUFFERS时候是不合法的。
额外的绘制线程会消耗系统的资源,在使用Su易做图ceView的时候要注意这点。
使用Su易做图ceView
只要继承Su易做图ceView类并实现Su易做图ceHolder.Callback接口就可以实现一个自定义的Su易做图ceView了,Su易做图ceHolder.Callback在底层的Su易做图ce状态发生变化的时候通知View,Su易做图ceHolder.Callback具有如下的接口:
su易做图ceCreated(Su易做图ceHolder holder):当Su易做图ce第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Su易做图ce。
su易做图ceChanged(Su易做图ceHolder holder, int format, int width,int height):当Su易做图ce的状态(大小和格式)发生变化的时候会调用该函数,在su易做图ceCreated调用后该函数至少会被调用一次。
su易做图ceDestroyed(Su易做图ceHolder holder):当Su易做图ce被摧毁前会调用该函数,该函数被调用后就不能继续使用Su易做图ce了,一般在该函数中来清理使用的资源。
通过Su易做图ceView的getHolder()函数可以获取Su易做图ceHolder对象,Su易做图ce 就在Su易做图ceHolder对象内。虽然Su易做图ce保存了当前窗口的像素数据,但是在使用过程中是不直接和Su易做图ce打交道的,由Su易做图ceHolder的Canvas lockCanvas()或则Canvas lockCanvas(Rect dirty)函数来获取Canvas对象,通过在Canvas上绘制内容来修改Su易做图ce中的数据。如果Su易做图ce不可编辑或则尚未创建调用该函数会返回null,在 unlockCanvas() 和 lockCanvas()中Su易做图ce的内容是不缓存的,所以需要完全重绘Su易做图ce的内容,为了提高效率只重绘变化的部分则可以调用lockCanvas(Rect dirty)函数来指定一个dirty区域,这样该区域外的内容会缓存起来。在调用lockCanvas函数获取Canvas后,Su易做图ceView会获取Su易做图ce的一个同步锁直到调用unlockCanvasAndPost(Canvas canvas)函数才释放该锁,这里的同步机制保证在Su易做图ce绘制过程中不会被改变(被摧毁、修改)。
当在Canvas中绘制完成后,调用函数unlockCanvasAndPost(Canvas canvas)来通知系统Su易做图ce已经绘制完成,这样系统会把绘制完的内容显示出来。为了充分利用不同平台的资源,发挥平台的最优效果可以通过Su易做图ceHolder的setType函数来设置绘制的类型,目前接收如下的参数:
SURFACE_TYPE_NORMAL:用RAM缓存原生数据的普通Su易做图ce
SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬件加速的Su易做图ce
SURFACE_TYPE_GPU:适用于GPU加速的Su易做图ce
SURFACE_TYPE_PUSH_BUFFERS:表明该Su易做图ce不包含原生数据,Su易做图ce用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Su易做图ce,有Camera负责提供给预览Su易做图ce数据,这样图像预览会比较流畅。如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了。
目前OPhone还不支持GIF动画图片的显示,这里就通过一个Su易做图ceView来展示如何定制一个支持GIF动画的View,同时从该示例(注释)中也可以看出如何使用Su易做图ceView。
首先创建一个GifView继承在Su易做图ceView,代码如下:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
android大扫盲之Su易做图ceView,Su易做图ceHolder,Su易做图ceHolder.CallBack.
你hold住了吗
最近接触到了Su易做图ceView,Su易做图ceHolder,Su易做图ceHolder.CallBack,一直不求其解,现在来粗浅认识一下它们。
先看一下官方的定义:
1.Su易做图ceView
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。
2.Su易做图ceHolder
显示一个su易做图ce的抽象接口,使你可以控制su易做图ce的大小和格式, 以及在su易做图ce上编辑像素,和监视surace的改变。这个接口通常通过Su易做图ceView类实现。
3. Su易做图ceHolder.Callback
用户可以实现此接口接收su易做图ce变化的消息。当用在一个Su易做图ceView 中时, 它只在Su易做图ceHolder.Callback.su易做图ceCreated()和Su易做图ceHolder.Callback.su易做图ceDestroyed()之间有效。设置Callback的方法是Su易做图ceHolder.addCallback.
看完官方的介绍,明白了许多,su易做图ceView带z-order的,还可以在上面操作像素有木有,还有单独的渲染线程哦亲。如果做游戏开发,当然选Su易做图ceView了。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
android中用Su易做图ceHolder处理Su易做图ceView的画图
在用Su易做图ceView进行游戏开发过程中,用到Su易做图ceHolder来处理它的Canvas上画的效果和动画是必不可少的。用于控制表面,大小,像素等。
Abstract inte易做图ce to someone holding a display su易做图ce. Allows you to control the su易做图ce size and format,
edit the pixels in the su易做图ce, and monitor changes to the su易做图ce. This inte易做图ce is typically available
through the Su易做图ceView class.
其易做图别要注意以下的几个函数:
abstract void addCallback(Su易做图ceHolder.Callback callback);
// 给Su易做图ceView当前的持有者一个回调对象。
abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。
例子:
// 请参考上一篇文章:android中用Su易做图ceView做游戏开发http://cg3a20.mail.163.com/a/f/js3/editor/0904231044/androidsu易做图ceview.htmlclass DrawThread extends Thread { private Su易做图ceHolder holder; private boolean running = true; protected DrawThread(Su易做图ceHolder holder) {this.holder = holder;} protected void doStop() { running = false; } public void run() { Canvas c = null; while( running ) { c = holder.lockCanvas(null); // 锁定整个画布,在内存要求比较高的情况下,建议参数不要为null try { synchronized(holder) { bGrid.drawGrid(c);//画游戏中的网格 BBoom.drawBooms(c, booms); //画游戏中的炸弹 bF
补充:移动开发 , Android ,