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的用法。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值