原文:Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系

Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screen compositor)管理的。

Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原生缓冲器以及其它方面的内容。

通过SurfaceHolder这个接口去访问Surface,而执行getHolder()方法可以得到SurfaceHolder接口。当SurfaceView的窗口可见时,Surface就会被创建,当SurfaceView窗口隐藏时,Surface就会被销毁。

SurfaceView提供了一个运行在渲染线程的surface,若要更新屏幕,需要了解以下线程知识。

  • 所有SurfaceView 和 SurfaceHolder.Callback的方法都应该在主线程(UI线程)里面调用,应该要确保渲染进程所访问变量的同步性。
  • 必须确保只有当Surface有效的时候,(也就是当Surface的生命周期在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间)才能让渲染进程访问。

SurfaceView与Surface的联系就是,Surface是管理显示内容的数据(implementsParcelable),包括存储于数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。

SurfaceHolder是控制surface的一个抽象接口,你可以通过SurfaceHolder来控制surface的尺寸和格式,或者修改surface的像素,监视surface的变化等等,SurfaceHolder是SurfaceView的典型接口。

与直接控制SurfaceView来修改surface不同,使用SurfaceHolder来修改surface时,需要注意lockCanvas() 和Callback.surfaceCreated().这两个方法。

SurfaceHolder控制surface的流程所使用的几个方法。

3.1、abstract void    addCallback(SurfaceHolder.Callback callback)
             Add
a Callback interface for this holder.// 给SurfaceHolder一个回调对象。
3.2、abstract
Canvas    lockCanvas(Rect dirty)
             Just like lockCanvas() but
allows specification of a dirty rectangle.
             // 锁定画布中的某一个区域,返回的画布对象Canvas(当更新的内容只有一个区域时,同时要追求高效,可以只更
             新一部分的区域,而不必更新全部画布区域)
3.3、abstract
Canvas    lockCanvas()
             Start editing the pixels in the surface.// 锁定画布,返回的画布对象Canvas
3.4、abstract
void    removeCallback(SurfaceHolder.Callback callback)
             Removes a previously added
Callback interface from this holder.//移除回调对象
3.5、abstract
void    unlockCanvasAndPost(Canvas canvas)
             Finish editing pixels in the surface.// 结束锁定画图,并提交改变

SurfaceHolder.Callback是监听surface改变的一个接口

  1. public abstract voidsurfaceChanged(SurfaceHolder
    holder, int format, int width, int height)

holder  The SurfaceHolder whose surface has changed.

format  The new PixelFormat of the surface.

width   The new width of the surface.

height  The new height of the surfa     //surface发生改变时被调用

  2. public abstract voidsurfaceCreated(SurfaceHolder
holder)

Parameters     holder    The
SurfaceHolder whose surface is being created

//在surface创建时被调用,一般在这个方法里面开启渲染屏幕的线程。

  3. public abstract voidsurfaceDestroyed(SurfaceHolder
holder)

Parameters     holder    The
SurfaceHolder whose surface is being destroyed.

//销毁时被调用,一般在这个方法里将渲染的线程停止。

Demo:

public class MainActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
} class MyView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
SurfaceHolder holder = null;
Paint paint; public MyView(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 创建画笔
paint.setColor(Color.RED); // 设置画笔颜色
this.setFocusable(true);
} @Override
public void surfaceCreated(SurfaceHolder holder) {
Thread t = new Thread(this);
t.start();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
isRunning = false;
} @Override
protected void onDraw(Canvas canvas) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.BLACK);
canvas.drawCircle(x, y, 10, paint);
holder.unlockCanvasAndPost(canvas);
} private void paint(Paint paint) {
Canvas canvas = holder.lockCanvas(); // 锁定画布,得到Canvas对象
canvas.drawColor(Color.WHITE); // 设定Canvas对象的背景颜色
canvas.drawCircle(x, y, 10, paint); // 在画布上画圆
holder.unlockCanvasAndPost(canvas); // 解除锁定,并提交修改内容,更新屏幕
}
boolean isRunning = true; @Override
public void run() {
while (isRunning) {
// onDraw(null);
paint(paint);
move();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} private int x, y;
private void move() {
x += 2;
y += 2;
}
}
}

Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback开发实例的更多相关文章

  1. Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系

    1.Surface Surface extends Objectimplements Parcelable java.lang.Object    ↳ android.view.Surface Cla ...

  2. Android中的Surface, SurfaceHolder, SurfaceHolder.Callback, SurfaceView

    传入一个surface,然后让openGL在surface上画图 window->view hierachy(DecorView是tree的root)->ViewRoot->Surf ...

  3. Android 展示控件之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系

    一.Surface Surface在SDK的文档中的描述是这样的:Handle onto a raw buffer that is being managed by the screen compos ...

  4. Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系

    转载请包含网址:http://blog.csdn.net/pathuang68/article/details/7351317 一.Surface Surface就是“表面”的意思.在SDK的文档中, ...

  5. Android中的Surface和SurfaceView

    一.什么是Surface 简单的说Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都要画在Surface的Canvas上(后面有原因解释).传统的view共享一 ...

  6. Android中surface,surfaceview,sufaceholder以及surface客户端的关系

    这里以照相机camera功能的实现来解释surface,surfaceview,sufaceholder以及surface客户端(本例子中指的是camera)的关系,surface及其client(客 ...

  7. Android 学习笔记之SurfaceView的使用+如何实现视频播放...

    学习内容: 1.掌握Surface的使用... 2.Android中如何实现视频播放... 1.SurfaceView类的使用   在Android中,一般播放音频时我们可以去使用Android提供的 ...

  8. 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)

    1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目“GameSurfaceView”,首先自定义一个类"MySurfac ...

  9. android 使用两个surfaceview 在摄像机画面上绘图

    转载自http://blog.csdn.net/jesse__zhong/article/details/24934083 使用双surface,将第一个设置为透明背景,在摄像机上绘制图像,纠结搞了一 ...

随机推荐

  1. References & the Copy-Constructor

    1 There are certain rules when using references: (Page 451) A reference must be initialized when it ...

  2. EF 存储过程(上)

    目前,EF对存储过程的支持并不完善.存在以下问题:> EF不支持存储过程返回多表联合查询的结果集.> EF仅支持返回某个表的全部字段,以便转换成对应的实体.无法支持返回部分字段的情况.&g ...

  3. 【ADO.NET】8、DataSet的使用

    一.DataSet的查询 SqlDataReader 适用于大型数据的读取,它是一条一条的读取,读取出来的数据是存放在服务器上当正在读取数据的时候,突然与服务中断,将无法读取后面的数据DataSet ...

  4. mysql导入导出.sql文件 备份还原数据库

    从数据库导出数据库文件:   进入你的MySQL的安装目录的bin目录或者在C盘的根目录都行,我选的是在bin目录下,下面的例子出第一个外将以在C盘的根目录来讲解   我的mysql安装在了C盘,C: ...

  5. input表单

    submit:点击submit按钮表单就会被提交给服务器,中文IE下默认按钮文本为“提交查询”,可以设置value属性修改按钮的显示文本 text:size属性为宽度,value为值,maxlengt ...

  6. [C#]async/Await 使用小计

    如果指定使用 异步 或 异步 修饰符,方法是异步方法,可以实现以下两个函数.  • 清单异步方法可以使用 Await 或指定的 等待 悬挂点.  等待运算符通知编译器异步方法不能继续点的过去,直到等待 ...

  7. 回顾javase点滴

    数据类型 8种基本数据类型和引用类型 数据类型 占用位数 存储方式 最小值 最大值 默认值 byte 8 1+7 -128(-2^7) 127(2^7-1) 0 short 16 1+15 -3276 ...

  8. TDirectory.Copy复制文件

    描述:复制文件夹以及文件夹下的内容 procedure Copy(const SourceDirName, DestDirName: string) 参数一:源文件夹 参数二:目标文件夹 所在单元:S ...

  9. Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法

    本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...

  10. PDF转WORD工具 Solid Converter PDF v9.1.6744

    Solid Converter PDF中文破解版(pdf转换成word转换器)是一款功能强大的PDF格式转换软件.Solid Converter PDF允许用户将PDF转换为Word(PDF to W ...