首先我们先来看下官方API对SurfaceView的介绍
SurfaceView的API介绍
Provides a dedicated drawing surface embedded inside of a view hierarchy. You can control the format of this surface and, if you like, its size; the SurfaceView takes care of placing the surface at the correct location on the screen
The surface is Z ordered so that it is behind the window holding its SurfaceView; the SurfaceView punches a hole in its window to allow its surface to be displayed. The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it. This can be used to place overlays such as buttons on top of the Surface, though note however that it can have an impact on performance since a full alpha-blended composite will be performed each time the Surface changes.
Access to the underlying surface is provided via the SurfaceHolder interface, which can be retrieved by calling getHolder().
The Surface will be created for you while the SurfaceView's window is visible; you should implement surfaceCreated(SurfaceHolder) and surfaceDestroyed(SurfaceHolder) to discover when the Surface is created and destroyed as the window is shown and hidden.
One of the purposes of this class is to provide a surface 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 SurfaceView and SurfaceHolder.Callback methods will be called from the thread running the SurfaceView'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 Surface while it is valid -- between SurfaceHolder.Callback.surfaceCreated() and SurfaceHolder.Callback.surfaceDestroyed().
对应的中文翻译
SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface的绘制位置。
surface是纵深排序(Z-ordered)的,这表明它总在自己所在窗口的后面。surfaceview提供了一个可见区域,只有在这个可见区域内 的surface部分内容才可见,可见区域外的部分不可见。surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示。这意味者 surface的内容会被它的兄弟视图遮挡,这一特性可以用来放置遮盖物(overlays)(例如,文本和按钮等控件)。注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。
你可以通过SurfaceHolder接口访问这个surface,getHolder()方法可以得到这个接口。
surfaceview变得可见时,surface被创建;surfaceview隐藏前,surface被销毁。这样能节省资源。如果你要查看 surface被创建和销毁的时机,可以重载surfaceCreated(SurfaceHolder)和 surfaceDestroyed(SurfaceHolder)。
surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。
接下来呢,说说自己对它的理解
1、定义
可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图容器。
它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。
2、实现
首先继承SurfaceView并实现SurfaceHolder.Callback接口
使用接口的原因:因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface—表面,这个概念在 图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容
可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。
需要重写的方法
(1)public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}
//在surface的大小发生改变时激发
(2)public void surfaceCreated(SurfaceHolder holder){}
//在创建时激发,一般在这里调用画图的线程。
(3)public void surfaceDestroyed(SurfaceHolder holder) {}
//销毁时激发,一般在这里将画图的线程停止、释放。
整个过程:继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。
3、SurfaceHolder
这里用到了一个类SurfaceHolder,可以把它当成surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(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.SurfaceHolder; 11 import android.view.SurfaceView; 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 SurfaceView implements SurfaceHolder.Callback 22 { 23 private SurfaceHolder holder; 24 private MyThread myThread; 25 public MyView(Context context) { 26 super(context); 27 // TODO Auto-generated constructor stub 28 holder = this.getHolder(); 29 holder.addCallback(this); 30 myThread = new MyThread(holder);//创建一个绘图线程 31 } 32 33 @Override 34 public void surfaceChanged(SurfaceHolder holder, int format, int width, 35 int height) { 36 // TODO Auto-generated method stub 37 38 } 39 40 @Override 41 public void surfaceCreated(SurfaceHolder holder) { 42 // TODO Auto-generated method stub 43 myThread.isRun = true; 44 myThread.start(); 45 } 46 47 @Override 48 public void surfaceDestroyed(SurfaceHolder holder) { 49 // TODO Auto-generated method stub 50 myThread.isRun = false; 51 } 52 53 } 54 //线程内部类 55 class MyThread extends Thread 56 { 57 private SurfaceHolder holder; 58 public boolean isRun ; 59 public MyThread(SurfaceHolder holder) 60 { 61 this.holder =holder; 62 isRun = true; 63 } 64 @Override 65 public void run() 66 { 67 int count = 0; 68 while(isRun) 69 { 70 Canvas c = null; 71 try 72 { 73 synchronized (holder) 74 { 75 c = holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。 76 c.drawColor(Color.BLACK);//设置画布背景颜色 77 Paint p = new Paint(); //创建画笔 78 p.setColor(Color.WHITE); 79 Rect r = new Rect(100, 50, 300, 250); 80 c.drawRect(r, p); 81 c.drawText("这是第"+(count++)+"秒", 100, 310, p); 82 Thread.sleep(1000);//睡眠时间为1秒 83 } 84 } 85 catch (Exception e) { 86 // TODO: handle exception 87 e.printStackTrace(); 88 } 89 finally 90 { 91 if(c!= null) 92 { 93 holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。 94 95 } 96 } 97 } 98 } 99 } 100 }
发表评论
-
初学Android,Intent概要(十一) .
2012-08-11 14:01 802下面内容我觉得归纳的很好,我看了几本书,包括一些英文的,写 ... -
初学Android,字符串,数字,尺寸,数组资源(十二) .
2012-08-11 00:09 1356下面是使用字符串,数字,尺寸,数组资源的例子,挺好,一个例子已 ... -
初学Android,使用Drawable资源之使用StateListDrawable资源(十三) .
2012-08-11 00:06 1158StateListDrawable用于组织多个Drawable ... -
初学Android,使用Drawable资源之使用LayerDrawable资源(十四)
2012-08-03 10:27 777LayerDrawable,系统将会按这些Drawable对象 ... -
初学Android,使用Drawable资源之使用ShapeDrawable资源(十五)
2012-08-03 14:40 1112ShapeDrawable比较简单,用来定义一个基本几何图形, ... -
初学Android,使用Drawable资源之使用ClipDrawable资源(十六)
2012-08-03 16:23 1065ClipDrawable代表从其它位图上截取一个"图 ... -
初学Android,使用Drawable资源之使用AnimationDrawable资源(十七)
2012-08-06 11:34 935这次学学怎么使用动画资源,AnimationDrawable, ... -
初学Android,使用自定义的XML资源(十八)
2012-08-06 15:16 684使用自定义的XML资源,这当然也必须是Android的一个功能 ... -
初学Android,使用菜单资源(十九)
2012-08-07 17:16 701Android里面也可用XML定义菜单资源,菜单分两种,一种是 ... -
初学Android,使用样式(style)资源(二十)
2012-08-09 09:57 768在Android里面,样式的概念跟网页中CSS样式表的概念相似 ... -
初学Android,使用主题(Theme)资源(二十一)
2012-08-09 11:06 746主题跟样式类似,也是放在路径/res/values下同样以&l ... -
初学Android,使用属性(Attribute)资源(二十二)
2012-08-09 14:47 785感觉这篇写的不错,拿来转了 http://wujia ... -
初学Android,使用原始资源(二十三)
2012-08-09 17:09 795原始资源就是Android没有为之提供专门支持的资源文件,可以 ... -
ImageAdapter和PopupWindow的使用
2012-08-09 17:35 1154引用public class SamplePopup exte ... -
requestWindowFeature类
2012-08-09 17:21 744requestWindowFeature可以设 ... -
android学习笔记(二)
2012-08-08 12:00 713Activities and Tasks 一个活动能启动另一 ... -
adnroid 学习笔记(一)
2012-08-06 16:10 621今天开始学习android,在配置资源文件时遇到的问题,在这里 ...
相关推荐
在这个"android之surfaceview学习示例"中,我们将深入探讨SurfaceView的核心特性和使用方法。 首先,SurfaceView拥有自己的Surface对象,它位于窗口的最底层,直接与硬件交互,允许在主线程之外进行绘制操作,避免...
在Android平台上进行游戏开发,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形绘制提供了可能,尤其适合用于创建动态、高性能的游戏画面。本文将深入探讨如何利用SurfaceView进行游戏开发,以及与之相关...
在Android平台上,SurfaceView是一种特殊的View,用于处理高性能、低延迟的图形绘制,尤其是在开发游戏或者视频播放等需要高效刷新率的应用时。本测试Demo旨在展示如何有效地利用SurfaceView进行游戏开发。以下是对...
在Android平台上,SurfaceView是一种特殊的视图,常用于处理高性能的图形渲染,比如播放视频或者游戏画面。在视频播放场景中,SurfaceView提供了一个高效且低延迟的显示机制,能够将视频帧直接绘制到Surface上,减少...
通过“Android-surfaceview-camera”项目,开发者可以学习到如何将SurfaceView与Camera结合,构建一个功能完善的相机应用。项目中的注释将有助于理解每个步骤的目的和实现细节,这对于Android开发者来说是一份宝贵的...
这个名为"基于android实现SurfaceView播放视频代码.rar"的压缩包提供了实现这一功能的源码参考,对于初学者和经验丰富的开发者来说都是一份宝贵的资源。下面,我们将深入探讨如何利用Android的SurfaceView组件来播放...
在Android平台上开发游戏时,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形渲染提供了可能。SurfaceView是Android系统提供的一种特殊视图,它有自己的独立绘制表面,与主线程分离,使得游戏或者视频这类...
在Android开发中,自定义`SurfaceView`是一个常见的需求,特别是在需要进行高性能图形绘制或视频播放等场景。本示例中的“Android自定义SurfaceView——实现画板功能”旨在教你如何利用`SurfaceView`创建一个可以...
在Android开发中,SurfaceView是一个非常重要的视图组件,它为高效显示动态视频或复杂的2D/3D图形提供了一个平台。SurfaceView拥有自己的独立渲染表面,与主线程的UI更新分离,使得高性能的图像处理成为可能。接下来...
在Android开发中,View和SurfaceView是两种非常重要的视图组件,它们被...同时,解压文件并查看源代码也是一个很好的学习途径,可以直接看到动画是如何在代码层面实现的,这对于提升Android图形编程能力非常有帮助。
在Android开发中,`SurfaceView`是一个非常重要的组件,它提供了与硬件图形渲染直接交互的能力。这个项目"android surfaceview自定义拍照 绘制头像轮廓"是基于网上现有的示例代码进行了修改,用于实现一个自定义的...
在Android游戏开发中,将一个`Button`控件悬浮于`SurfaceView`之上是一项常见的需求。这通常是为了解决在游戏界面中添加交互元素,如暂停、设置或返回按钮,以便用户可以随时进行操作。本篇文章将深入探讨如何实现这...
SurfaceView是Android系统提供...综上所述,这个项目涵盖了SurfaceView的基本使用,包括创建、绘制以及截图等关键步骤,同时也涉及到Bitmap操作和用户交互,是一个很好的学习和实践Android图形处理和自定义视图的实例。
在Android平台上,SurfaceView是一种特殊的视图,常用于处理高...对于学习Android游戏开发的初学者来说,这是一个很好的实践项目,能够深入理解SurfaceView的工作原理,并了解如何结合物理引擎来创建更复杂的游戏逻辑。
本示例“Android使用SurfaceView实现墨迹天气的风车效果”是一个很好的学习资源,适用于毕业设计或论文研究。这个项目主要展示了如何利用Android的SurfaceView组件来创建类似墨迹天气应用中的风车动画效果。下面将...
对于学生来说,这个案例提供了很好的实践机会,可以学习到Android视图层次结构、SurfaceView的特殊性质,以及如何在复杂的UI布局中处理高性能的图形渲染。同时,它还涵盖了Android开发中的布局管理和事件处理等基础...
在Android平台上进行游戏开发时,SurfaceView是一个至关重要的组件,它是专门为高性能的图形渲染设计的。这个源代码可能包含了一个自定义的SurfaceView类,用于实现更高效、更灵活的游戏界面。下面,我们将深入探讨...
在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得...这个示例程序提供了一个实践这些概念的起点,开发者可以通过学习和修改它来提升自己在Android动画开发方面的技能。
总之,"Android基于SurfaceView的小游戏"是一个典型的Android游戏开发示例,它涵盖了Android图形编程、游戏逻辑设计、事件处理和资源管理等多个方面,对于Android开发者来说,学习和实践这样的项目有助于提升技能和...
总的来说,这个"Android SurfaceView 多线程 滑块"示例是一个很好的学习资源,它涵盖了Android开发中的多线程编程、自定义视图、动画效果和性能优化等多个重要知识点,对于提升Android应用的性能和用户体验有着重要...