android游戏之SurfaceView
16lz
2021-01-25
先说Surface
打开这个文件:frameworks\base\core\java\android\view\Surface.java
对于Surface这个class在开始有这样一段注释:Handle onto a raw buffer that is being managed by the screen compositor.
从这里就明白了Surface 的用处了。其翻译:Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像 合成器(screen compositor)管理的。
简单一点,Surface 就是一个管理屏幕显示图像的数据的。
在这个class里面,你可以看到他定义了:private final Canvas mCanvas = new CompatibleCanvas();
CompatibleCanvas这个class是 Surface 这个class的内部class.。
好,CompatibleCanvas 这个class有几个方法定义:
public int getWidth()
public int getHeight()
public void setMatrix(Matrix matrix)
public void getMatrix(Matrix m)
为什么要说这个呢?如果你不懂得话,那先要了解Canvas 。
Canvas是什么?
CompatibleCanvas这个class定义的地方有详细的英文说明,其英文说明太长,这里就不贴出来了。一般可以将Canvas
理解为一个画布!或是一个呈现图像等资源显示的一个面板!比如,你要画画给别人看,那你的画总要画到一张纸上或是什么上面吧,这里Canvas 就相当于这张纸。
那么上面的几个方法就很好理解了,getWidth() 获取这个画布的宽,getHeight 获取其高度 。当然setMatrix 就是对这个画布的大小等形状的处理了。
说了这么多,其实并没有那么复杂。可以理解为,Surface就是一个对这个Canvas 的管理和处理的,Canvas 就是一个呈现画面的画布!
再说SurfaceView
打开这个文件:frameworks\base\core\java\android\view\SurfaceView.java
public class SurfaceView extends View {
.......
}
可以看出,SurfaceView 其实就是一个继承View 的一个class
这个class有这样一段代码:
final Surface mSurface = new Surface();
定义了一个Surface。
这个里有意大段英文说明:
* Provides a dedicated drawing surface embedded inside of a view hierarchy. * You can control the format of this surface and, if you like, its size; the * SurfaceView takes care of placing the surface at the correct location on the * screen SurfaceView提供了一个专门用于绘制的surface,这个surface内嵌于。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface在屏幕的正确绘制位置。
简单理解:就是SurfaceView提供了在当前屏幕当前这个view绘制这个surface。
其实对于surface,SurfaceView提供了一个一个可见区域,只有在这个可见区域内 的surface部分内容才可见,可见区域外的部分不可见。
注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。
在这个class里面还定义了一个管理、获取这个surface的变量:
private SurfaceHolder mSurfaceHolder = new SurfaceHolder()
可以通过SurfaceHolder这个接口获取surface 以及 他的Canvas 。然后在这个Canvas 上绘制你想要的画面。
这里要说一下SurfaceView几个状态的变化:
surfaceview被创建;surfaceview可见;surfaceview隐藏,surfaceview被销毁。
surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。
打开这个文件:frameworks\base\core\java\android\view\Surface.java
对于Surface这个class在开始有这样一段注释:Handle onto a raw buffer that is being managed by the screen compositor.
从这里就明白了Surface 的用处了。其翻译:Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像 合成器(screen compositor)管理的。
简单一点,Surface 就是一个管理屏幕显示图像的数据的。
在这个class里面,你可以看到他定义了:private final Canvas mCanvas = new CompatibleCanvas();
CompatibleCanvas这个class是 Surface 这个class的内部class.。
好,CompatibleCanvas 这个class有几个方法定义:
public int getWidth()
public int getHeight()
public void setMatrix(Matrix matrix)
public void getMatrix(Matrix m)
为什么要说这个呢?如果你不懂得话,那先要了解Canvas 。
Canvas是什么?
CompatibleCanvas这个class定义的地方有详细的英文说明,其英文说明太长,这里就不贴出来了。一般可以将Canvas
理解为一个画布!或是一个呈现图像等资源显示的一个面板!比如,你要画画给别人看,那你的画总要画到一张纸上或是什么上面吧,这里Canvas 就相当于这张纸。
那么上面的几个方法就很好理解了,getWidth() 获取这个画布的宽,getHeight 获取其高度 。当然setMatrix 就是对这个画布的大小等形状的处理了。
说了这么多,其实并没有那么复杂。可以理解为,Surface就是一个对这个Canvas 的管理和处理的,Canvas 就是一个呈现画面的画布!
再说SurfaceView
打开这个文件:frameworks\base\core\java\android\view\SurfaceView.java
public class SurfaceView extends View {
.......
}
可以看出,SurfaceView 其实就是一个继承View 的一个class
这个class有这样一段代码:
final Surface mSurface = new Surface();
定义了一个Surface。
这个里有意大段英文说明:
* Provides a dedicated drawing surface embedded inside of a view hierarchy. * You can control the format of this surface and, if you like, its size; the * SurfaceView takes care of placing the surface at the correct location on the * screen SurfaceView提供了一个专门用于绘制的surface,这个surface内嵌于。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface在屏幕的正确绘制位置。
简单理解:就是SurfaceView提供了在当前屏幕当前这个view绘制这个surface。
其实对于surface,SurfaceView提供了一个一个可见区域,只有在这个可见区域内 的surface部分内容才可见,可见区域外的部分不可见。
注意,如果surface上面 有透明控件,那么它的每次变化都会引起框架重新计算它和顶层控件的透明效果,这会影响性能。
在这个class里面还定义了一个管理、获取这个surface的变量:
private SurfaceHolder mSurfaceHolder = new SurfaceHolder()
可以通过SurfaceHolder这个接口获取surface 以及 他的Canvas 。然后在这个Canvas 上绘制你想要的画面。
这里要说一下SurfaceView几个状态的变化:
surfaceview被创建;surfaceview可见;surfaceview隐藏,surfaceview被销毁。
surfaceview的核心在于提供了两个线程:UI线程和渲染线程。这里应注意:
1> 所有SurfaceView和SurfaceHolder.Callback的方法都应该在UI线程里调用,一般来说就是应用程序主线程。渲染线程所要访问的各种变量应该作同步处理。
2> 由于surface可能被销毁,它只在SurfaceHolder.Callback.surfaceCreated()和 SurfaceHolder.Callback.surfaceDestroyed()之间有效,所以要确保渲染线程访问的是合法有效的surface。
更多相关文章
- Android: 如何利用Handler处理和发送消息来实现页面刷新的功能
- Android(安卓)——对AsyncTask的理解和注意事项
- Android(安卓)单例模式
- 【Android(安卓)基础】 ListView 部分Item不可选中
- android彻底杀死当前activity和线程方法
- android执行远程地址,就会报android.os.Net..... 这个原因是网络
- Android(安卓)Handler 绑定自定义线程之HandlerThread
- android之图像处理、缩放、修改图片、绘图
- C#与android连接 SimpleWifi