`
绝杀fc小飞侠
  • 浏览: 1195 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android - SurfaceView

阅读更多

Reference:http://158067568.iteye.com/blog/905407

为什么选择SurfaceView

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

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

 

Java代码  收藏代码
  1. abstract void            surfaceChanged(SurfaceHolder holder, int format, int width, int height)  
  2. This is called immediately after any structural changes (format or size) have been made to the surface.  
  3. abstract void    surfaceCreated(SurfaceHolder holder)  
  4. This is called immediately after the surface is first created.  
  5. abstract void    surfaceDestroyed(SurfaceHolder holder)  
  6. 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如下:

 

Java代码  收藏代码
  1. abstract void            addCallback(SurfaceHolder.Callback callback)  
  2. Add a Callback interface for this holder.  

 

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

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

 

Java代码  收藏代码
  1. abstract Canvas      lockCanvas()  
  2. Start editing the pixels in the surface.  

 

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

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

 

Java代码  收藏代码
  1. abstract Canvas      lockCanvas(Rect dirty)  
  2. Just like lockCanvas() but allows to specify a dirty rectangle.  

 

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

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

 

Java代码  收藏代码
  1. abstract void            unlockCanvasAndPost(Canvas canvas)  
  2. Finish editing pixels in the surface.
分享到:
评论

相关推荐

    Android-surfaceview-camera

    本项目“Android-surfaceview-camera”专注于利用SurfaceView来实现一个自定义的相机应用。下面将详细介绍SurfaceView与Camera在Android开发中的应用及核心知识点。 1. **SurfaceView介绍** SurfaceView是Android...

    android-SurfaceView 测试Demo

    在Android平台上,SurfaceView是一种特殊的View,用于处理高性能、低延迟的图形绘制,尤其是在开发游戏或者视频播放等需要高效刷新率的应用时。本测试Demo旨在展示如何有效地利用SurfaceView进行游戏开发。以下是对...

    mini-bird-android-surfaceview

    《迷你小鸟Android SurfaceView游戏开发详解》 在Android游戏编程领域,SurfaceView是开发者们常用的一个组件,尤其对于初学者来说,它是一个很好的起点。本文将深入探讨如何使用SurfaceView来构建一个简单的“迷你...

    Android---SurfaceView

    在Android开发中,SurfaceView是一种特殊的视图组件,它提供了在UI线程之外进行渲染的能力,使得复杂的图形或视频处理可以在后台线程中执行,从而避免阻塞主线程导致的ANR(Application Not Responding)问题。...

    Android代码-SurfaceView添加组件view不被组件覆盖.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建高性能的图形界面,比如游戏或者视频播放器。通常,SurfaceView有一个独立的渲染线程,用于处理高耗时的图形操作,以避免阻塞主线程,...

    Android游戏开发学习(2)--SurfaceView实例控制角色移动

    在Android游戏开发中,SurfaceView是一个非常重要的组件,它提供了高效、低延迟的图形渲染机制,特别适合用于游戏和实时视频等对性能要求较高的场景。本篇将详细讲解如何使用SurfaceView来实例控制角色移动。 首先...

    Android中SurfaceView截屏

    在Android开发中,`SurfaceView`是一个非常重要的视图组件,尤其在处理视频播放、游戏渲染等高性能图形操作时,它的优势在于拥有独立于主线程的渲染机制,能避免阻塞UI更新。然而,由于其特殊的性质,直接通过常规...

    Android多媒体开发06-SurfaceView框架.ppt

    在Android多媒体开发中,SurfaceView是一个非常重要的组件,尤其在处理高性能、低延迟的图形渲染时,例如游戏开发。SurfaceView框架提供了一种高效且独立于主线程的绘图方式,使得开发者可以在单独的线程中进行连续...

    安卓动画效果相关-SurfaceView与Canvas结合使用实现动画效果.rar

    SurfaceView是Android系统提供的一种特殊类型的视图,它允许开发者在单独的线程中进行绘图操作,从而实现流畅的动画。Canvas则是Android图形绘制的核心工具,它提供了丰富的绘图方法,如画点、线、矩形等,开发者...

    Android-HeartView通过继承SurfaceView实现直播点亮功能的心形效果

    本案例中的“Android-HeartView通过继承SurfaceView实现直播点亮功能的心形效果”就是一个典型的自定义视图实例,主要涉及到Android图形绘制、SurfaceView的使用以及动画效果的实现。 1. **自定义视图(Custom View...

    实例3--使用surfaceView

    SurfaceView是Android系统中一个非常重要的视图组件,它在处理复杂的图形绘制和视频播放等高性能应用时扮演着关键角色。本实例将深入探讨SurfaceView的工作原理及其使用方法。 1. **SurfaceView概述** SurfaceView...

    Android 通过SurfaceView 实现实时显示摄像头视频

    总之,通过SurfaceView实现实时显示摄像头视频是Android开发中的一个基础任务,涉及到对Android系统相机API的理解和使用,以及对SurfaceView生命周期的掌握。随着技术的发展,开发者可以选择更高级的API,如Camera2...

    Android SurfaceView 实现图片缩放 滑动

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者创建高性能的图形界面,尤其适合处理视频播放或游戏等需要连续刷新的场景。本话题主要探讨如何利用SurfaceView实现图片的缩放和滑动功能。 首先,理解...

    Android双SurfaceView底部拍照,顶部绘图

    Android双SurfaceView底部拍照,顶部绘图,当SurfaceHolder对象的类型设置为SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS时就只能拍照不能绘制了。为了既能通过SurfaceView拍照又能在上面绘制图形,可以通过双...

    EasyPlayer-RTSP-Android-master.zip

    - **关键类**:如`RtspPlayer`负责RTSP连接和播放控制,`MediaPlayerService`作为服务处理后台播放,`SurfaceView`用于视频渲染。 4. **应用实践**: - **集成到项目**:将EasyPlayer库引入Android Studio项目,...

    android之surfaceview学习示例

    在Android开发中,SurfaceView是一个非常重要的视图组件,它为开发者提供了在应用程序中实现高性能图形渲染的能力。SurfaceView的设计初衷是为了处理那些需要频繁更新且对性能要求较高的场景,如视频播放、游戏画面...

    最简单的surfaceview画图和截图

    SurfaceView是Android系统提供的一种特殊的View,主要用于处理高性能、低延迟的图形绘制,例如游戏画面或者视频播放等场景。它的核心特性在于拥有自己的独立线程(SurfaceThread)来管理Surface的绘制,这使得...

    Android SurfaceView添加组件view不被组件覆盖.zip

    在Android开发中,SurfaceView是一种特殊的视图,它允许开发者在应用程序中创建一个独立的、高性能的绘图表面。SurfaceView通常用于视频播放、游戏或者需要频繁更新图像的场景。然而,有时候当我们尝试在SurfaceView...

    Android圆形相机预览窗口,圆形SurfaceView

    这个场景就涉及到了Android的SurfaceView以及如何定制它的显示效果。本文将深入探讨如何实现一个圆形的相机预览窗口。 首先,让我们理解SurfaceView的基本概念。SurfaceView是Android系统提供的一种用于显示多媒体...

    android之surfaceview游戏开发

    在Android平台上进行游戏开发,SurfaceView是一个至关重要的组件,它为高效、低延迟的图形绘制提供了可能,尤其适合用于创建动态、高性能的游戏画面。本文将深入探讨如何利用SurfaceView进行游戏开发,以及与之相关...

Global site tag (gtag.js) - Google Analytics