surfacechanged(Camera中surfaceHolder、surfaceChanged问题,请大牛进来指点一二)

本文目录
- Camera中surfaceHolder、surfaceChanged问题,请大牛进来指点一二
- surfaceDestroyed什么时候被调用
- 如何让SurfaceView重新启动
- surfacechanged 什么时候调用
- 怎么消耗 surfaceview的buffer
Camera中surfaceHolder、surfaceChanged问题,请大牛进来指点一二
近些天因为要调整打开照相机的速度性能问题,所以就跟了一下打开照相机的onCreate和onResume方法。在onCreate中有:[mw_shl_code=java,true]SurfaceHolder… 详细
surfaceDestroyed什么时候被调用
surfaceCreated(SurfaceHolderholder):当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。surfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight):当Surface的状态(大小和格式)发生变化的时候会调用该函数,在surfaceCreated调用后该函数至少会被调用一次。surfaceDestroyed(SurfaceHolderholder):当Surface被摧毁前会调用该函数,该函数被调用后就不能继续使用Surface了,一般在该函数中来清理使用的资源。
如何让SurfaceView重新启动
在surface的大小发生改变时激发
(2)public void surfaceCreated(SurfaceHolder holder){}
/,所有的绘图工作必须得在Surface 被创建之后才能开始。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界.addCallback(callback)添加回调函数----》,并提交改变;/SurfaceHolder; SurfaceView,一般在这里将画图的线程停止如何去使用一个SurfaceView.Callback接口 ----》:继承SurfaceView并实现SurfaceHolder。
整个过程、释放,int width; Canvas绘画 ----》.unlockCanvasAndPost(Canvas canvas)结束锁定画图,一般在这里调用画图的线程。
需要重写的方法
(1)public void surfaceChanged(SurfaceHolder holder;在创建时激发;/:
首先继承SurfaceView并实现SurfaceHolder;销毁时激发,将图形显示;SurfaceHolder.getHolder()获得SurfaceHolder对象 ----》.Callback接口。因为使用SurfaceView 有一个原则,而在Surface 被销毁之前必须结束。可以被直接复制到显存从而显示出来.lockCanvas()获得Canvas对象并锁定画布----》。
(3)public void surfaceDestroyed(SurfaceHolder holder) {}
/,这使得显示速度会非常快,int height){}
/,int format;/SurfaceHolder
surfacechanged 什么时候调用
surfaceDestroyed这个函数什么时候被调用呢? 上网搜了一番,基本都说是surface被销毁的时候,才会调用surfaceDestroyed。问题又来了surface什么时候被销毁呢,大家都知道surface是surfaceview的一个专门用于画.
怎么消耗 surfaceview的buffer
、SurfaceView的使用
首先继承SurfaceView,并实现SurfaceHolder.Callback接口,实现它的三个方法:surfaceCreated,surfaceChanged,surfaceDestroyed。
surfaceCreated(SurfaceHolder holder):surface创建的时候调用,一般在该方法中启动绘图的线程。
surfaceChanged(SurfaceHolder holder, int format, int width,int height):surface尺寸发生改变的时候调用,如横竖屏切换。
surfaceDestroyed(SurfaceHolder holder) :surface被销毁的时候调用,如退出游戏画面,一般在该方法中停止绘图线程。
还需要获得SurfaceHolder,并添加回调函数,这样这三个方法才会执行。
如何得到SurfaceHolder?其实很简单,在SurfaceView中提供了getHolder()方法。如果该surfaceView中还需要实现回调生命周期,那么holder还需要调用addCallback()方法为其添加回调声明周期。
SurfaceHolder中还有几个十分重要的方法:
lockCanvas():该方法用于锁定画布,这样Surface中就可以指定back buffer中的画布是那一块了。之后就可以在画布上进行绘画,该方法的API如下
lockCanvas()方法是对整个Surface进行重绘,但是很多情况下,我们只需要对Surface的一小部分进行重画时,则使用lockCanvas(Rect dirty)更为明智。
lockCanvas(Rect dirty)通过其中的参数也可以看出,其只更新Rect部分的画面。
以上两个方法是对Canvas进行锁定,当Canvas绘制完毕之后,Surface的front buffer就需要这个Surface进行显示。如果此时Canvas还在锁定状态,则Surface的front buffer将不能得到Canvas。所以此时应该在canvas绘画完毕之后,释放锁定。
unlockCanvasAndPost(Canvas canvas):用于释放出于锁定状态的Canvas。

更多文章:
maven配置idea(如何在idea中用maven配置spark和scala)
2026年10月10日 22:50
详情页模板免费网站有哪些(我是一名淘宝美工,要做一个宝贝详情页,去什么网站能找到比较好的素材)
2026年10月10日 22:30







