【Android应用开发技术:用户界面】SurfaceView

原创 2015年07月31日 16:51:53

作者:郭孝星
微博:郭孝星的新浪微博
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
Github:https://github.com/AllenWells

【Android应用开发技术:用户界面】章节列表

SurfaceView是一个可以直接从内存或DMA等硬件接口取得图像数据的绘图容器。

一 SurfaceView基本特性

SurfaceView不依赖于UI线程,也不会阻塞UI线程,适用于自动完成绘图,而无需等待用户输入的情况。一般的View依赖于UI线程画图,适用于完全依赖于用于输入的进行图像显示和更新的情况。

SurfaceView是视图View的继承类,这个视图内嵌了一个专门用于绘制的Surface,你可以控制这个Surface的格式、尺寸和位置。Surface是纵深排序的(Z-ordered)的,这表明它总是在自己所在窗口的后面。SurfaceView提供了一个可见区域,只有在这个可见区域的Surface部分内容才可见,其余部分不可见。

Surface的排版显示受到视图层级关系的影响,它的兄弟视图结点会在顶端显示,也就是说Surface的内容会被它的兄弟视图遮挡。这一特性可以用来放置遮盖物(overlays),如果Surface上面有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这回影响性能。
Surface变得可见时,Surface被创建,Surface隐藏前,Surface被销毁。

二 SurfaceView架构模型

两个线程:

  • UI线程:所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程中调用,一般来说是应用的主线程。
  • 渲染线程:该线程所要的访问的各种变量应该做同步处理。

具体模型如下图所示:

这里写图片描述

三 SurfaceView实现

(1) 继承SurfaceView并实现SurfaceHolder.Callback接口。

使用接口的原因:
在使用SurfaceView时,所有的绘图工作必须的在Surface被创建之后才能开始,而在Surface销毁之前必须被结束。

(2) 需要重写的方法

public void surfaceChanged(SurfaceHolder holder,int format,int width,int height);

在surface的大小发生改变时激发

public void surfaceCreated(SurfaceHolder holder);

在创建时激发,一般在这里调用画图的线程。

public void surfaceDestroyed(SurfaceHolder holder);

销毁时激发,一般在这里将画图的线程停止、释放。

整个过程如下所示:

  1. 继承SurfaceView并实现SurfaceHolder.Callback接口
  2. SurfaceView.getHolder()获得SurfaceHolder对象
  3. SurfaceHolder.addCallback(callback)添加回调函数
  4. SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布
  5. Canvas绘画
  6. SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。

【Android应用开发技术:用户界面】用户界面基本原理

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年07月31日 17:07
  • 1161

【Android应用开发技术:用户界面】ViewAnimator

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年05月07日 21:05
  • 486

【Android应用开发技术:用户界面】SurfaceHolder

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年07月31日 16:52
  • 723

【Android应用开发技术:用户界面】AdapterView

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年05月07日 21:04
  • 479

【Android应用开发技术:用户界面】ImageView

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年05月07日 21:00
  • 415

【Android应用开发技术:用户界面】TextView

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年05月07日 21:02
  • 670

【Android应用开发技术:用户界面】布局管理器

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://githu...
  • AllenWells
  • AllenWells
  • 2015年08月17日 17:19
  • 1190

【Android应用开发技术:用户界面】ProgressBar

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年05月07日 21:02
  • 415

【Android应用开发技术:用户界面】Dialog

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年05月07日 21:05
  • 410

【Android应用开发技术:用户界面】Menu

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
  • AllenWells
  • AllenWells
  • 2015年05月07日 21:03
  • 465
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Android应用开发技术:用户界面】SurfaceView
举报原因:
原因补充:

(最多只允许输入30个字)