Surface与SurfaceView、SurfaceHolder

相较于普通视图组件,Surface、SurfaceView和SurfaceHolder是Android系统中与图像绘制相关的关键组件和接口。它们在Android应用程序中具有重要的作用,可用于实现实时绘制、视频播放、相机预览等功能。接下来就详细介绍一下它们的特点、使用方法及相关案例。

一、Surface

Surface是一个低级的图像绘制表面,其中包含像素数据,并且可以直接在屏幕上进行渲染。Surface的主要特点包括:

1.像素数据:Surface可以容纳任意类型的像素数据,例如位图(Bitmap)、YUV数据等。

2. 绘制方式:Surface支持直接绘制、硬件加速绘制和离屏渲染等多种绘制方式。

3. 多线程操作:Surface可以在多个线程中进行读写操作,允许多线程同时绘制。

使用Surface的一般步骤如下:

1. 创建Surface实例:可以通过Surface类的构造函数创建一个Surface实例。例如,可以从一个现有的SurfaceView或TextureView中获取Surface实例。

2. 锁定Surface:在进行绘制之前,通常需要先使用lockCanvas()方法获取一个Canvas对象,用于绘制图像。在成功获取Canvas对象之后,需要记得最后要调用unlockCanvasAndPost()方法将Canvas对象解锁并提交。

3. 绘制图像:使用Canvas对象进行图像绘制,可以使用各种绘制方法,例如drawBitmap()、drawText()等。

4. 刷新显示:绘制完成后,调用unlockCanvasAndPost()方法将绘制结果提交,并刷新到屏幕上。

示例代码如下:

```java

Surface surface = new Surface(surfaceTexture); // 根据一个SurfaceTexture实例创建Surface对象

Canvas canvas = surface.lockCanvas(null); // 获取Canvas对象

// 进行图像绘制

// ...

surface.unlockCanvasAndPost(canvas); // 提交绘制结果并刷新显示

```

二、SurfaceView

SurfaceView是一个可以在后台线程中绘制图像的视图组件。与普通的View不同,SurfaceView在底层实现上独立于UI线程,使得图像绘制可以在后台线程中进行,避免了阻塞UI线程的问题。SurfaceView的主要特点包括:

1. 双缓冲机制:SurfaceView内部实现了双缓冲机制,即前台缓冲区和后台缓冲区。前台缓冲区用于显示,后台缓冲用于图像绘制,这样可以避免图像闪烁的问题。

2. SurfaceView Callback:SurfaceView提供了一个SurfaceHolder接口,其中定义了多个回调方法,用于处理Surface的创建、改变、销毁等事件。开发者可以重写这些回调方法,实现自定义的图像绘制逻辑。

3. 独立的绘制线程:SurfaceView支持在后台线程中进行图像绘制,这样可以避免在UI线程中进行复杂的绘制操作,提高了绘制的效率。

使用SurfaceView的一般步骤如下:

1. 定义SurfaceView:在XML布局文件中定义SurfaceView,或者在Java代码中动态创建SurfaceView。

2. 获取SurfaceHolder:通过SurfaceView的getHolder()方法获取SurfaceHolder对象。

3. 设置Callback:通过SurfaceHolder的addCallback()方法设置一个回调对象,用于处理Surface的创建、改变、销毁等事件。

4. 开启绘制线程:在回调方法中开启一个后台线程,用于进行图像的实时绘制。

示例代码如下:

```java

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder mSurfaceHolder;

private MyThread mThread;

public MySurfaceView(Context context) {

super(context);

init();

}

public MySurfaceView(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

private void init() {

mSurfaceHolder = getHolder();

mSurfaceHolder.addCallback(this);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

mThread = new MyThread(holder);

mThread.start();

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// surface发生改变时的处理逻辑

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

mThread.stopThread();

}

private static class MyThread extends Thread {

private SurfaceHolder mSurfaceHolder;

private boolean mRunning;

public MyThread(SurfaceHolder surfaceHolder) {

mSurfaceHolder = surfaceHolder;

mRunning = true;

}

@Override

public void run() {

while (mRunning) {

Canvas canvas = mSurfaceHolder.lockCanvas(null);

// 进行图像绘制

// ...

mSurfaceHolder.unlockCanvasAndPost(canvas);

}

}

public void stopThread() {

mRunning = false;

}

}

}

```

三、SurfaceHolder

SurfaceHolder是Surface的控制器对象,用于控制Surface的大小、格式以及绘制操作。SurfaceHolder的主要特点包括:

1. 控制Surface:SurfaceHolder提供了一系列方法,允许开发者控制Surface的创建、改变、销毁等操作。

2. 获取Canvas对象:通过SurfaceHolder的lockCanvas()方法可以获取一个Canvas对象,用于图像的绘制。

3. 通知Surface状态:通过SurfaceHolder的setFixedSize()、setFormat()等方法可以设置Surface的大小、格式等属性,并通知系统重新创建Surface。

使用SurfaceHolder的一般步骤如下:

1. 获取SurfaceHolder:可以通过SurfaceView的getHolder()方法获取SurfaceHolder对象。

2. 设置Callback:通过SurfaceHolder的addCallback()方法设置一个回调对象,用于处理Surface的创建、改变、销毁等事件。

3. 控制Surface:通过SurfaceHolder的一系列方法控制Surface的大小、格式等属性,并进行图像绘制。

示例代码如下:

```java

SurfaceHolder surfaceHolder = surfaceView.getHolder();

surfaceHolder.addCallback(new SurfaceHolder.Callback() {

@Override

public void surfaceCreated(SurfaceHolder holder) {

// Surface创建时的处理逻辑

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

// Surface发生改变时的处理逻辑

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// Surface销毁时的处理逻辑

}

});

Canvas canvas = surfaceHolder.lockCanvas(null); // 获取Canvas对象

// 进行图像绘制

// ...

surfaceHolder.unlockCanvasAndPost(canvas); // 提交绘制结果并刷新显示

```

以上就是Surface、SurfaceView和SurfaceHolder的详细介绍和使用方法。它们在实现实时绘制、视频播放、相机预览等功能方面具有重要的作用。在开发过程中,可以根据实际需求选择合适的组件和接口来实现图像绘制。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(105) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部