首页 > 编程知识 正文

surface(surfaceview闪一下)

时间:2023-05-05 05:57:52 阅读:76122 作者:390

安卓游戏开发框架核心组件

核心组件介绍SurfaceView介绍SurfaceView介绍SurfaceView是带Surface的视图。 因为它是view,是view的子类,所以它可以像其他view一样在屏幕上显示任何内容并接收用户输入,并且具有view的生命周期回调函数。 例如,诸如onMeasure、onLayout、onDraw和onTouchEvent之类的表面视图具有独立的表面(独立表面和窗口表面),从而子线程独立此子线程(可以提供SurfaceView接口)称为渲染线程,但要使独立的Surface上的内容显示在View上,请将该Surface中的canvas上的内容显示在View的真实画布上这将使UI线程空闲(surface holder.callback.surface created () )和surface holder.callback.surface destroyed () ) 要确保渲染线程访问的是有效的SurfaceSurfaceHolder.CallBack,请在SurfaceView中的SurfaceHolder中执行以下操作,因为这只是在创建和销毁surface时返回到前面的两种方法当“SurfaceView”实现回调并将其设置为“SurfaceHolder”时,“SurfaceView”可以侦听此独立曲面的创建和销毁。 sdk中介绍的SurfaceView是嵌入了仅用于绘制的Surface的视图的继承类。 您可以控制此Surface的格式和大小。 表面视图控制此表面的绘制位置。

surface是“深度排序”(Z-ordered ),表示它始终位于您所在窗口的后面。 “surfaceview”具有可见区域,只能看到该可见区域内的“surface”部分的内容,而不能看到可见区域外的部分。

表面合成的显示受视图级别关系的影响,同级视图节点显示在顶部。 这是surface的意思

的内容在兄弟视图中隐藏。 可以使用该特性放置“覆盖”(overlays )。 例如,文本和按钮等控件。 请注意,如果表面上有透明控件,则每次更改时框架都会重新计算与顶级控件之间的透明效果,从而影响性能。

可以通过surfaceHolder界面访问此surface。 getHolder ()方法可以获得此接口。

当surfaceview显示时,将创建surface; 在surfaceview隐藏之前,surface将被销毁。 这样可以节约资源。 若要查看何时创建和销毁表面,UI线程位于“表面创建”(surfaceholder )和“表面描述”(surfacedestroyed )“表面轮廓”(surfaceholder )表面视图的中心

这里需要注意的是:

1 .在UI线程中调用所有SurfaceView和SurfaceHolder.Callback方法。 一般是APP应用程序主线程。 因此,渲染线程访问的各种变量必须同步处理。

surface holder.callback.surface created ()和surface holder.callback.surface destroyed ) )之间

表面。

SurfaceHolder是SurfaceView中的Surface软件包,它不仅负责在SurfaceHolder.callback界面中回调创建和销毁Surface 由于将Surface的主要方法LockCanvas ()、unLockCanvasAndPost )方法包装在线程安全中,因此SurfaceHolder是Surface对象的所有者,也是Surface的

脏矩形Rect dirty是需要废弃、即重写该矩形区域的数据的矩形区域,lockCanvas(rectdirty )可以指定对Surface中的canvas上的数据的一部分进行再描绘的矩形区域。

表面视图、表面保持器和表面之间的关系

SurfaceView使用的步骤是获取与SurfaceView对应的SurfaceHolder并将SurfaceHolder.callback对象添加到SurfaceHolder中。 创建渲染线程对象时,图形将开始绘制在Surface上。 因为SurfaceView不公开Surface,而是公开Surface的包装器SurfaceHolder。 因此,使用SurfaceHolder的lockCanvas ()获取Surface上方指定区域的Canvas,在该Canvas上绘制图形,绘制结束后,在SurfaceHolder的unlockCanvasAndPost ) ) 然后,在UI线程中,在View的Canvas上的SurfaceView中使用Surface上的内容demopublicclassgameuiextendssurfaceviewimplementssurfaceholder.callbace 私密布尔is draw=false; //控制绘制的开关publicgameui (上下文) super (上下文) context ); holder=this.getHolder (; Holder.addcallback(this; renderThread=new RenderThread (; } @ overridepublicvoidsurfacechanged (surfaceholder,int format,int width,int height ) } @ overridepublicvoidsurface rface } @ overridepublicvoidsurfacedestroyed (surfaceholderholder ) { isDraw=false; } /** *呈现接口的线程* * @ author administrator * */privateclassrenderthreadextendsthread { @ overridepublicvoidrun () } } /** *界面绘制*/public void drawUI () { canvas canvas=holder.lock canvas ); try{Drawcanvas(canvas ); }catch(exceptione ) { e.printStackTrace ); (finally ) holder.unlockcanvasandpost ) canvas; } privatevoiddrawcanvas (canvas canvas )绘制canvas所需图形) }罗升阳的博客SurfaceView源代码分析

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。