surfaceview甯х巼,surfaceview璇﹁В
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!
SurfaceDestroyed原文:
屏幕的显示机制和帧动画类似,也是一帧一帧的连环画,只不过刷新频率很高,感觉像连续的。为了显示一帧,需要经历计算和渲染两个过程,CPU 先计算出这一帧的图像数据并写入内存,然后调用 OpenGL 命令将内存中数据渲染成图像存放在 GPU Buffer 中,显示设备每隔一定时间从 Buffer 中获取图像并显示。上则销亮述过程中的计算,对于View来说,就好比在主线程遍历 View树 以决定视图画多大(measure),画在哪(layout),画些啥(draw),计算结果存放在内存中,SurfaceFlinger 会调用 OpenGL 命令将内存中的数据渲染成图像存放在 GPU Buffer 中。每隔16.6ms,显示器从 Buffer 中取出帧并显示。所以自定义 View 可以通过重载onMeasure()、onLayout()、onDraw()来定义帧内容,但不能定义帧刷新频率。SurfaceView可以突破这个限制。而且它可以将计算帧斗脊数据放到独立的线程中进行。下面是自定义SurfaceView的模版代码:
public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
public static final int DEFAULT_FRAME_DURATION_MILLISECOND = 50;
// 用于计算帧数据孙宽的线程
private HandlerThread handlerThread;
private Handler handler;
// 帧刷新频率
private int frameDuration = DEFAULT_FRAME_DURATION_MILLISECOND;
// 用于绘制帧的画布
private Canvas canvas;
private boolean isAlive;
public BaseSurfaceView(Context context) {
super(context);
init();
}
protected void init() {
getHolder().addCallback(this);
// 设置透明背景,否则SurfaceView背景是黑的
setBackgroundTransparent();
}
private void setBackgroundTransparent() {
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setZOrderOnTop(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isAlive = true;
startDrawThread();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopDrawThread();
isAlive = false;
}
// 停止帧绘制线程
private void stopDrawThread() {
handlerThread.quit();
handler = null;
}
// 启动帧绘制线程
private void startDrawThread() {
handlerThread = new HandlerThread(“SurfaceViewThread”);
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
handler.post(new DrawRunnable());
}
private class DrawRunnable implements Runnable {
@Override
public void run() {
if (!isAlive) {
return;
}
try {
// 1. 获取画布
canvas = getHolder().lockCanvas();
// 2. 绘制一帧
onFrameDraw(canvas);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 3. 将帧数据提交
getHolder().unlockCanvasAndPost(canvas);
// 4. 一帧绘制结束
onFrameDrawFinish();
}
}
}
SurfaceDestroyed改写:
屏幕显示的原理就像是一幅连环画,通过连续不断地刷新帧的方式来呈现动态画面。为了展示一帧画面,需要经过计算和渲染两个步骤。首先,CPU会计算出这一帧的图像数据,并将数据写入内存。然后,通过调用OpenGL命令,将内存中的数据渲染成图像,并存储在GPU缓冲区中。显示设备会每隔一定的时间从缓冲区中获取图像并显示在屏幕上。
以上是关于计算的过程,对于View来说,就好像在主线程中遍历View树,决定每个视图的尺寸(measure)、位置(layout)和绘制内容(draw),计算的结果会存储在内存中。SurfaceFlinger会调用OpenGL命令,将内存中的数据渲染成图像,并存放在GPU缓冲区中。显示器会每隔16.6毫秒从缓冲区中获取一帧图像并显示。
因此,自定义View可以通过重写onMeasure()、onLayout()和onDraw()方法来定义每一帧的内容,但是不能定义帧的刷新频率。而SurfaceView可以突破这个限制。此外,SurfaceView还可以将计算帧数据的过程放在独立的线程中进行。
下面是自定义SurfaceView的模板代码:
public abstract class BaseSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
public static final int DEFAULT_FRAME_DURATION_MILLISECOND = 50;
// 用于计算帧数据的线程
private HandlerThread handlerThread;
private Handler handler;
// 帧刷新频率
private int frameDuration = DEFAULT_FRAME_DURATION_MILLISECOND;
// 用于绘制帧的画布
private Canvas canvas;
private boolean isAlive;
public BaseSurfaceView(Context context) {
super(context);
init();
}
protected void init() {
getHolder().addCallback(this);
// 设置透明背景,否则SurfaceView背景是黑的
setBackgroundTransparent();
}
private void setBackgroundTransparent() {
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setZOrderOnTop(true);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
isAlive = true;
startDrawThread();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
stopDrawThread();
isAlive = false;
}
// 停止帧绘制线程
private void stopDrawThread() {
handlerThread.quit();
handler = null;
}
// 启动帧绘制线程
private void startDrawThread() {
wwW.Xtw.Com.cN系统网专业的PC、手机系统开发下载平台,HarmonyOS系统、安卓、OS、windows电脑重装系统在线下载安装,操作系统平台技术学习,攻略教程,技术交流。
免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!
联系邮箱:773537036@qq.com
相关推荐
-
android接入mqtt流程,android接入微信登录
2024-07-13 06:36:49 -
windows 11安卓子系统文件在哪里,windows11android
2024-07-13 06:29:04 -
android权限代码大全,android不同版本的权限处理
2024-07-13 03:17:55 -
android调试桥下载,android调试黑屏
2024-07-13 02:05:56 -
android系统怎么下软件,android是什么系统如何下载和升级
2024-04-12 11:00:18 -
android系统应用是什么,android软件开发下载
2024-04-12 08:21:28