Android surface的使用

1.1
使用surface时,包含了三个类的使用,分别是surface,surfaceView,SurfaceHolder.
(1)Sueface类:每一个surface在系统内部都对应了一段单独的视频缓冲区,surface就是这段缓冲区的一个类描述,可以通过surface提供的方法直接给这段缓冲区上绘图。
(2)SurfaceHolder类:该类是一个接口,主要是抽象出用于控制其对应的surface的标准方法。
(3)surfaceView类:surface本身并不是和GUI协同工作的,GUI需要为应用程序单独分配一段显示区,而这段显示区在一定程度上还要受到GUI的管理,比如,创建,销毁显示区;同时该显示区在一定程度上还需要和其他视图之间具有某种联系,以备GUI重新绘制界面时所需,而surface本身是一段显示缓冲区,内部并不具备这些操作的属性,surfaceView就是为满足这些操作而设计的。
3者的关系可如下所示:
GUI系统——>surfaceView——>surface
应用程序——>surfaceHolder——>surface
GUI系统通过surfaceView来操作surface,而应用程序则是通过surfaceHolder来操作surface,一般情况下,无论是应用程序还是系统,都不直接调用surface这个接口。
从单纯绘制界面的角度来看surface,在标准的GUI视图中,要绘制对应的界面只能在onDraw()方法中,因为只有在onDraw()方法中才能得到画布canvas对象。对于surface来讲,处于应用程序的考虑,子程序可以获得一个独立的surface对象,可以随时任意的绘制界面。因此surface有一个获取画布的接口,lockCanvas(),该方法返回此surface对应的画布,子程序是可以自由的享受这个surface,满足应用的界面需求。
使用surface的大多数场合是游戏开发,因为在游戏开发中,往往需要一些特别地界面元素,包括图形,变换和动画等内容。如何在surface上绘图:::
声明surface,可以在layout.xml文件中使用关键字定义一个Surface对象,就像是用Button定义一个按钮一样,在xml中声明一个surface以后,调用SetContentView()方法创建该对象时,系统不会立即创建,即surface的创建时异步的,只有当surface创建好之后,用户才能使用该surface,子程序绘制surface时,一般通过surfaceHolder对象,每个surface对应一个Holder,当surface创建好后,会回调对应的Holder对象定义的回调函数,这就是SurfaceHolder.Callback接口。
该接口包含了三个方法,分别是:
SurfaceCreated(),当surface创建好后,会调用该函数,一般可以在干函数内部设置一个系统变量,用于标识surface是否创建好。
Public void surfaceCreated(SurfaceHolder holder){
msurfaceExsit=true;
}
surfaceChanged(),当surface的界面大小改变时,调用该方法。
surfaceDestroy();当surface对象被销毁时时,调用该方法。
在实际的游戏当中,往往会启动另一个线程用以控制surface内部的显示和用户交互,而在创建该线程时,只需要传递surface对应的surfaceHolder即可,同时,可以为子程序创建一个Handler对象,主线程可以通过该Handler对象像子程序传递用户的按键消息。
总结:
Surface是android的一个重要元素,用于android画面的图形绘制。
SurfaceView是视图(View)的一个继承类,每一个SurfaceView都内嵌封装一个Surface。通过调用SurfaceHolder可以调用SurfaceView,控制图形的尺寸和大小。
SurfaceHolder 是通过getholder()来取得。
创立SurfaceHolder 对象后,用SurfaceHolder.Callback()来回调SurfaceHolder,对SurfaceView进行控制。
 sv=(SurfaceView)this.findViewById(R.id.surfaceview);

 sh=sv.getHolder();
 sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 sf=sh.getSurface();
 sh.setKeepScreenOn(true);
 sh.addCallback(new SurfaceListener());

发布了133 篇原创文章 · 获赞 2 · 访问量 3370

猜你喜欢

转载自blog.csdn.net/qq_42894864/article/details/104730417