SurfaceView概述
作者:Legend
QQ:158067568
之前我讲解了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,还是去看看吧)。
控制SurfaceView的SurfaceHolder
上一节的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绘制完毕之后,Surface的front buffer就需要这个Surface进行显示。如果此时Canvas还在锁定状态,则Surface的front buffer将不能得到Canvas。所以此时应该在canvas绘画完毕之后,释放锁定。
unlockCanvasAndPost(Canvas canvas):用于释放出于锁定状态的Canvas。API如下:
abstract void unlockCanvasAndPost(Canvas canvas)
Finish editing pixels in the surface.
纸上谈来终觉浅,下一节我将通过一个模拟小球跳跃的例子来讲解SurfaceView的用法。
分享到:
相关推荐
### SurfaceView概述与核心知识点详解 #### 一、SurfaceView简介 SurfaceView是Android系统中一个重要的绘图组件,主要用于实现实时视频流播放、游戏动画等高性能绘图场景。它是一个视图(View)的子类,其核心功能...
1. **SurfaceView概述** SurfaceView是一个特殊的View,它在视图层次结构中创建了一个独立的Surface,可以在这个Surface上进行离屏渲染,避免了UI线程的阻塞。这意味着SurfaceView非常适合用于处理需要频繁更新且对...
1. SurfaceView概述: SurfaceView是Android系统提供的一种可以在主线程之外进行渲染的视图组件。它的内部有一个单独的Surface,这个Surface是由一个单独的线程(称为SurfaceHolder.Callback)来更新的,这使得...
1. SurfaceView概述 SurfaceView是Android视图体系中的一员,但与普通View不同的是,它有自己的Surface对象,这个Surface位于应用程序和系统窗口管理器之间,可以独立于UI线程进行绘制,从而避免了频繁更新UI对主线...
一、概述 今天给大家带来SurfaceView的一个实战案例,话说自定义View也是各种写,一直没有写过SurfaceView,这个玩意是什么东西?什么时候用比较好呢? 可以看到SurfaceView也是继承了View,但是我们并不需要去实现...
#### 概述 在Android开发过程中,特别是针对游戏开发中的SurfaceView组件应用时,文本显示的美观与合理性尤为重要。一个常见的需求是根据屏幕的宽度自动调整文本的换行,使得文本能够适配不同尺寸和分辨率的设备...
- 使用`SurfaceView`、`SurfaceTexture`+`TextureView`或`GLSurfaceView`作为显示预览界面的组件。 - 这些组件都包含一个单独的Surface,作为获取摄像头数据的容器。 2. **连接HAL并打开摄像头**: - 在`...
#### 一、概述 在移动应用开发中,为了提升用户体验,开发者经常会加入一些视觉特效。其中,“图片镜像倒影特效”是一种非常受欢迎的效果,它可以让图片底部产生一种对称的镜像反射,增加应用的美观度和趣味性。 ##...
**知识点概述:** 在游戏开发中,长按按钮的功能非常常见,特别是在需要持续输入的动作类游戏中。Android系统提供了多种方式来实现长按功能,本章节将详细介绍如何通过自定义`ImageButton`来实现一个能够响应长按...
#### 一、概述 在Android应用开发中,视频播放功能是非常常见且重要的一个组成部分。无论是教育应用、娱乐软件还是社交平台,高质量的视频播放体验都是吸引用户的关键因素之一。本文将从`VideoView`与`SurfaceView ...
基于线程和 SurfaceView 的游戏动画效果实现:线程和 SurfaceView 是 Android 平台上实现游戏动画效果的关键技术。线程可以实现游戏的异步处理,而 SurfaceView 则可以实现游戏的图形渲染。 5. 游戏测试和维护: ...
## 项目概述 AVProject是一个专注于Android音视频开发的学习和实践项目。通过一系列的步骤和示例代码,帮助开发者掌握音视频采集、处理、编码、封装、传输和播放的全流程。 ## 学习线路 1. **绘制图片**:使用...
一、概述: 因为播放视频需要很大的内存,所以必须使用surfaceview , surfaceview 里实现了双缓冲的功能, 二、全部代码: /** * @描述 使用surfaceview 创建视频 * @项目名称 App_Basic * @包名 ...
本文介绍了基于 Android 平台的飞机大战游戏设计与开发的知识点,包括 Android 平台概述、Eclipse 和 Android ADT 集成开发平台、Android 游戏开发、SurfaceView 绘制游戏界面、Android 生命週期、广播机制、Java ...
以下是一个简化的步骤概述: 1. **初始化SurfaceView**:在布局文件中声明SurfaceView,并在Activity中找到并获取对应的SurfaceHolder。 2. **设置SurfaceHolder回调**:添加SurfaceHolder.Callback,监听Surface的...
`SurfaceView`用于展示摄像头预览画面,`SurfaceHolder`则是`SurfaceView`的一个接口,用于控制`SurfaceView`的画布,而`Callback`通常指的是一些回调接口,不是用于拍照的直接类。 ### LocationManager获取位置...
### 一、Android屏幕截图概述 在Android应用开发中,有时候我们需要获取当前屏幕的图像,例如,在游戏或某些特殊功能中保存当前界面作为截图。Android系统提供了多种方式来实现这一功能,下面我们将逐一介绍这些...
#### 二、技术要点概述 在开发过程中,主要涉及的技术点包括但不限于: - **Android开发环境**:需要搭建Android开发环境,包括安装Android Studio等工具。 - **UI设计**:通过XML定义用户界面,包括绘图区域(`...