SurrfaceView详解

本文详细介绍了SurfaceView与View的区别,重点在于SurfaceView的主动更新特性,适合频繁刷新的场景。并展示了如何创建和初始化SurfaceView,包括开启子线程进行绘制。还提供了两个实例,一是利用SurfaceView绘制sin图像,二是实现屏幕绘画功能。SurfaceView的双缓冲机制确保了高效绘制,避免主线程阻塞。
摘要由CSDN通过智能技术生成

关于SurfaceView的使用

1.SurfaceView和View之间的区别:

a.View主要适用于被动更新的情况下,而SurfaceView主要适用于主动更新,比如频繁地刷新;这里说明下主动更新和被动更新。

主动更新:比如要绘制一个人一直在跑动,那么这就需要独开一个线程不停地去绘制人的状态,为了避免阻塞主线程,这时候会采用surfaceView来实现。

被动更新:比如绘制棋谱类,对于这种我们通过onTouch事件,使用invalidate来更新画面即可。

b.View在主线程中对画面进行更新,而SurfaceView通常会通过一个子线程来进行页面的刷新,当然surfaceView也可以在主线程中去更新画面。但我们一般不会选择这么做,因为当主线程去更新画面且更新时间较长,那么主线程会被阻塞,导致无法响应按键,触屏等。

c.View在绘图时没有使用双缓冲机制,而SurfaceView在底层机制中就实现了双缓冲机制。

关于双缓冲机制原理的讲解推荐下面的博客,讲解的非常透彻:

双缓冲机制原理

双缓冲机制的使用

总的来说:如果你自定义的View需要频繁刷新,或者刷新时数据量比较大,那么可以考虑使用SurfaceView。

2.surfaceView的使用方法:

a.创建SurfaceView:创建一个自定义的SurfaceView继承自SurfaceView,并实现两个接口——SurfaceView.Callback和Runnable,如下:

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
    }   
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    }
     @Override
    public void run() {
    }
}

以上便是我们创建的SurfaceView的基本架构了,当然还需要添加其构造函数,这里就不贴出来了。

b.初始化SurfaceView:

首先先定义相关变量:

//定义一个SurfaceHolder对象,SurfaceHolder可以看作是SurfaceView的管理者
private SurfaceHolder mHolder;
//定义绘图的画布
private Canvas mCanvas;
//定义子线程的标志,用来判断是否继续开启子线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值