原文: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. (转)IOS学习笔记-2015-03-29 int、long、long long取值范围

    unsigned - - unsigned - - unsigned __int64的最大值: __int64的最小值:- unsigned __int64的最大值:  

  2. html doctype 作用

    文档模式主要有以下两个作用: 1.告诉浏览器使用什么样的html或xhtml规范来解析html文档 2.对浏览器的渲染模式产生影响:不同的渲染模式会影响到浏览器对于 CSS 代码甚至 JavaScri ...

  3. python三级菜单的实现

    一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...

  4. 10g和11g,优化器对外连接的处理对比

    我反省,今天面试有个问题没有说清楚.我给出的结论(而且这个结论我验证过)是:不要使用不必要的外连接,举了下面这个例子却没有说清楚.虽然最近感冒,状态不是很好,但最擅长的东西都没有表达清楚,泪流满面啊: ...

  5. HBase安装inAction

    在安装Hbase之前,需要有hadoop的运行环境,关于hadoop的安装过程,请查看我之前的blog:hadoop安装笔记:或者另一个博主的超详细文章http://weixiaolu.iteye.c ...

  6. 警惕arm-linux-gcc编译器优化选项

    arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执行效率更高.但是,倘若我们就是需要程序慢一点运行,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的 ...

  7. Forget asp.net membership,ASP.NET Identity Overview

    http://www.asp.net/identity http://www.asp.net/identity/overview/getting-started/introduction-to-asp ...

  8. web design tools

    https://www.google.com/webdesigner/ http://html.adobe.com/edge/inspect/ http://www.creativebloq.com/ ...

  9. TCP/IP入门学习(1)---分层概述

    本文旨在记述一些学习中的笔记 OSI分层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层 详细点: 1.应用层:为应用程序提供服务并规定程序中通信相关细节. 2.表示层:将应用处理的信息转 ...

  10. hdu 1824

    也是一道2-sat的入门题: 不过题目描述的不清楚,看了别人的题解才知道题意: 和上面的那题差不多,一个模板: 代码: #include<cstdio> #include<stack ...