`
158067568
  • 浏览: 327006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SurfaceView概述

阅读更多

SurfaceView概述

作者:Legend

QQ158067568

之前我讲解了Surface的绘图原理概述,对于程序员,怎么使用可能是眼下至关重要的事情。本节讲解SurfaceView的使用。但在此之前我想先简单概述一下SurfaceView的特点。

为什么选择SurfaceView

众所周知,SurfaceView继承自View,但它与View不同?View是在UI的主线程中更新画面,而SurfaceView是在一个新线程中更新画面。我们不可能写一个方法让主线程自己运动。View的特性决定了其不适合做动画,因为如果更新画面时间过长,那么主UI线程就会被正在画的函数阻塞。所以Android中通常用SurfaceView显示动画效果。

在对SurfaceView进行操作前Android为我们提供了一个十分好用的接口:SurfaceHolder.Callback接口。该接口中有三个抽象方法,这三个抽象方法是SurfaceView的三个生命周期:

abstract void            surfaceChanged(SurfaceHolder holder, int format, int width, int height)
This is called immediately after any structural changes (format or size) have been made to the surface.
abstract void    surfaceCreated(SurfaceHolder holder)
This is called immediately after the surface is first created.
abstract void    surfaceDestroyed(SurfaceHolder holder)
This is called immediately before a surface is being destroyed.
 

以上是从Api中我直接copy出来的,相信如果熟悉Activity的朋友我就不用过多进行解释了(当然,如果不熟悉Acitvity,还是去看看吧)。

控制SurfaceViewSurfaceHolder

上一节的Surface概述中我曾经说过每一个Surface都有一个Canvas,而Surface自身控制自己的大小等等属性。但是Surface是如何控制自己的呢?

SurfaceView中一般通过使用SurfaceHolder类来控制Canvas在其surface上的操作。

得到SurfaceHolder

如何得到SurfaceHolder?其实很简单,在SurfaceView中提供了getHolder()方法。如果该surfaceView中还需要实现回调生命周期,那么holder还需要调用addCallback()方法为其添加回调声明周期。API如下:

abstract void            addCallback(SurfaceHolder.Callback callback)
Add a Callback interface for this holder.
 

SurfaceHolder中还有几个十分重要的方法:

lockCanvas():该方法用于锁定画布,这样Surface中就可以指定back buffer中的画布是那一块了。之后就可以在画布上进行绘画,该方法的API如下,

abstract Canvas      lockCanvas()
Start editing the pixels in the surface.
 

lockCanvas()方法是对整个Surface进行重绘,但是很多情况下,我们只需要对Surface的一小部分进行重画时,则使用lockCanvas(Rect dirty)更为明智。

lockCanvas(Rect dirty)通过其中的参数也可以看出,其只更新Rect部分的画面。API入下:

abstract Canvas      lockCanvas(Rect dirty)
Just like lockCanvas() but allows to specify a dirty rectangle.
 

以上两个方法是对Canvas进行锁定,当Canvas绘制完毕之后,Surfacefront buffer就需要这个Surface进行显示。如果此时Canvas还在锁定状态,则Surfacefront buffer将不能得到Canvas。所以此时应该在canvas绘画完毕之后,释放锁定。

unlockCanvasAndPost(Canvas canvas):用于释放出于锁定状态的CanvasAPI如下:

abstract void            unlockCanvasAndPost(Canvas canvas)
Finish editing pixels in the surface.
 

纸上谈来终觉浅,下一节我将通过一个模拟小球跳跃的例子来讲解SurfaceView的用法。

 

 

 

 

 

2
0
分享到:
评论
2 楼 snowspace 2012-11-06  
学习了
1 楼 阮胜憬灏 2012-10-01  
   

相关推荐

    Android中利用SurfaceView制作抽奖转盘的全流程攻略

    一、概述 今天给大家带来SurfaceView的一个实战案例,话说自定义View也是各种写,一直没有写过SurfaceView,这个玩意是什么东西?什么时候用比较好呢? 可以看到SurfaceView也是继承了View,但是我们并不需要去实现...

    Android开发实现的简单媒体播放器功能示例

    一、概述: 因为播放视频需要很大的内存,所以必须使用surfaceview , surfaceview 里实现了双缓冲的功能, 二、全部代码: /** * @描述 使用surfaceview 创建视频 * @项目名称 App_Basic * @包名 ...

    Android应用中实现手势控制图片缩放的完全攻略

    一、概述 现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~ 我相信看图的整个步骤,大家或者说用户应该不...

    Android代码-BSRGift

    1.概述 直播项目的礼物模块,实现一些基本的礼物动画,随着项目的深入,BSR也将会继续完善(2017-5-20,很不幸项目搁浅了。。。关于优化,有兴趣童鞋的可以试试重写textureview、surfaceview,效果应该要好很多) 2....

    Animation-Tutorials:with有关动画的教程,其中包括“动画师”,“动画矢量可绘制对象”,“共享过渡”等

    概述 有关动画师,动画基础知识以及使用基于协程的SurfaceView创建上下运动的计数器的教程 第2-3章圆形展示 Ch2-4旋转X / Y翻转 通道2-6缩放 Ch2-7渐变 第2-8章计数器TextViews Ch2-9计数器SurfaceView Ch3-1物理...

    Android开发与应用——张荣,原书配套课件

    9.1.4 SurfaceView 9.2 摄像头的使用 9.2.1 摄像头意图Intent 9.2.2 Camera类 9.3 小结 练习 实验一 Android开发环境搭建 实验二 界面设计:基本组件 实验三 界面设计:布局管理器 实验四 多线程应用 ...

    Android 中使用 dlib+opencv 实现动态人脸检测功能

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo。该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用矩形框描绘出来。具体实现原理如下: ...

    android开发揭秘PDF

    5.1.2 SurfaceView类开发框架 5.2 Graphics类开发 5.5.1 Paint和Color类介绍 5.2.2 Canvas类介绍 5.2.3 几何图形绘制 5.2.4 字符串绘制 5.2.5 图像绘制 5.2.6 图像旋转 5.2.7 图像缩放 5.2.8 图像像素操作 5.2.9 ...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    2.5.2 使用surfaceview实现2d动画 50 2.6 socket网络通信 56 2.6.1 socket开发基本知识 56 2.6.2 服务器端 57 2.6.3 客户端 58 2.7 蓝牙通信 59 2.7.1 蓝牙通信的基本知识 60 2.7.2 聊天案例...

    《Android应用开发揭秘》附带光盘代码.

     5.1.2 SurfaceView类开发框架  5.2 Graphics类开发  5.5.1 Paint和Color类介绍  5.2.2 Canvas类介绍  5.2.3 几何图形绘制  5.2.4 字符串绘制  5.2.5 图像绘制  5.2.6 图像旋转  5.2.7 图像缩放  5.2.8 ...

    《Android应用开发揭秘》源码

     5.1.2 SurfaceView类开发框架  5.2 Graphics类开发  5.5.1 Paint和Color类介绍  5.2.2 Canvas类介绍  5.2.3 几何图形绘制  5.2.4 字符串绘制  5.2.5 图像绘制  5.2.6 图像旋转  5.2.7 图像缩放  5.2.8 ...

    Android应用开发揭秘pdf高清版

    5.1.2 SurfaceView类开发框架 5.2 Graphics类开发 5.5.1 Paint和Color类介绍 5.2.2 Canvas类介绍 5.2.3 几何图形绘制 5.2.4 字符串绘制 5.2.5 图像绘制 5.2.6 图像旋转 5.2.7 图像缩放 5.2.8 图像像素操作 5.2.9 ...

    疯狂Android讲义源码

     13.5.2 Web Service平台概述 510  13.5.3 使用Android应用调用  Web Service 512  13.6 本章小结 524  第14章 管理Android手机桌面 525  14.1 管理手机桌面 526  14.1.1 删除桌面组件 526  14.1.2 添加桌面...

    疯狂Android讲义.part2

    13.5.2 Web Service平台概述 510 13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理手机桌面 526 14.1.1 删除桌面组件 526 14.1.2 添加桌面组件 526 14.2 ...

    疯狂Android讲义.part1

    13.5.2 Web Service平台概述 510 13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理手机桌面 526 14.1.1 删除桌面组件 526 14.1.2 添加桌面组件 526 14.2 ...

    android群雄传

    6.8 View之孪生兄弟——SurfaceView 155 6.8.1 Surface View与View的区别 155 6.8.2 Surface View的使用 156 6.8.3 Surface View实例 159 第7章 Android动画机制与使用技巧 162 7.1 Android View动画框架 163 ...

Global site tag (gtag.js) - Google Analytics