Surface与SurfaceView、SurfaceHolder

Surface是Android中用于绘制图像和进行视图渲染的一个重要的核心类。它提供了一个绘图的画布,可以在其上进行图像操作和显示。

SurfaceView是一个可以在后台线程中进行图像绘制的自定义视图。它继承自View,但是和普通的View不同,SurfaceView有自己的Surface,并且可以在后台线程中进行绘制操作,而普通的View只能在UI线程中绘制。这个特点使得SurfaceView适用于需要进行复杂绘制或者频繁刷新的场景,比如游戏开发、视频播放等。

SurfaceHolder是SurfaceView中用于管理Surface的一个接口。它提供了很多方法用于控制Surface的状态和属性,比如设置Surface的像素格式、获取Surface的宽高等。通过SurfaceHolder,我们可以得到Surface对象,并且可以通过SurfaceHolder来操作Surface,进行绘制、锁定、解锁等操作。

下面是SurfaceView和SurfaceHolder的常用方法的介绍:

1. SurfaceView常用方法:

- surfaceCreated(SurfaceHolder holder):当SurfaceView创建时被调用。

- surfaceChanged(SurfaceHolder holder, int format, int width, int height):当SurfaceView的尺寸变化时被调用。

- surfaceDestroyed(SurfaceHolder holder):当SurfaceView销毁时被调用。

2. SurfaceHolder常用方法:

- lockCanvas():获取一个画布对象,可以在此画布上进行绘制操作。

- unlockCanvasAndPost(Canvas canvas):将绘制完毕的画布提交显示。

- getSurface():获取当前的Surface对象。

- addCallback(SurfaceHolder.Callback callback):添加一个SurfaceHolder的回调接口。

- setType(int type):设置Surface的类型,比如设置为透明、半透明等。

使用SurfaceView和SurfaceHolder的示例代码如下:

```java

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

private SurfaceHolder mSurfaceHolder;

private Thread mThread;

private boolean mIsRunning;

public MySurfaceView(Context context) {

super(context);

initView();

}

public MySurfaceView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

private void initView() {

mSurfaceHolder = getHolder();

mSurfaceHolder.addCallback(this);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// Surface创建时被调用

mIsRunning = true;

mThread = new Thread(this);

mThread.start();

}

@Override

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

// Surface尺寸变化时被调用

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// Surface销毁时被调用

mIsRunning = false;

try {

mThread.join();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Override

public void run() {

while (mIsRunning) {

Canvas canvas = null;

try {

canvas = mSurfaceHolder.lockCanvas();

// 在canvas上进行绘制操作

} catch (Exception e) {

e.printStackTrace();

} finally {

if (canvas != null) {

mSurfaceHolder.unlockCanvasAndPost(canvas);

}

}

}

}

}

```

这是一个使用SurfaceView和SurfaceHolder来进行图像绘制的自定义视图类。在surfaceCreated方法中启动一个线程,然后在线程中通过lockCanvas获取一个画布对象进行绘制,绘制完成后通过unlockCanvasAndPost将画布提交显示。

总结:Surface是Android中用于绘制图像和进行视图渲染的核心类,SurfaceView是一个可以在后台线程中进行图像绘制的自定义视图,SurfaceHolder是SurfaceView中用于管理Surface的接口。通过使用SurfaceView和SurfaceHolder,我们可以实现复杂的图像绘制和视图渲染操作。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(48) 打赏

评论列表 共有 0 条评论

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