菜鸟笔记3——Android Camera程序扩充(1) SurfaceHolder问题

来源:互联网 发布:淘宝查号是什么意思 编辑:程序博客网 时间:2024/04/26 21:59
今天希望进行的改动是对onPictureTaken()方法进行改动以实现照片存储在sdcard里,但在这之前,更重要的是进行程序的重构,用《深入浅出Android》作者Gasolin的话说:“可运作的程序与可维护的程序之间,还有一道难以言说的鸿沟”。

为了使代码简洁,对代码进行MVC模式的改造,即分离model,view,control.代码暂时不贴,大概就是把所有界面元件的宣告都写到findViews()里,所有View被Click后的执行动作都放到setListener()里。

另外,为了使IsiCamera1Activity类里的核心方法onCreate尽量短,把能‘外包’的代码都用private method提取出去。否则onCreate函数会变得奇长无比并几乎无法阅读(满眼都是注释的感觉太糟了)

在改造过程中我参考了《Android开发应用实战详解》里的Camera例程,希望实现里面的拍完一张以后,照下来的照片停留片刻,又能接着拍下一张。他采取的做法是拍照->储存->释放Camera camera->再次实例化camera(代码如下)

camera=Camera.open();//但是在google tutorial给的代码里,Camera.open()方法写了,但是找不到在哪里调用过!放在这里备案以免忘记。

在google给的程序里 camera = Camera.open()出现在了interface SurfaceHolder.Callback的abstract void surfaceCreated()里面,代码如下:

@Override         public void surfaceCreated(SurfaceHolder holder)          {               try{     //Open the Camera in preview mode       this.camera = Camera.open();      this.camera.setPreviewDisplay(this.holder);      }catch(IOException ioe) {     ioe.printStackTrace(System.out);}         }

我猜想,仅仅是猜想,SurfaceHolder holder这个东西有着神奇的作用,他使得SurfaceView一旦实例化新对象,就会调用surfaceCreated方法,不用另写一句mCameraSurfaceView.surfaceCreated();

holder这个词在googleAPI手册上多次见到,不知道什么意思。thinking in java书里搜索过也没有,留在这里备忘。

更新:对SurfaceHolder holder的理解已解决:

先来看看代码:

     private class CameraSurfaceView extends SurfaceView      implements SurfaceHolder.Callback {private SurfaceHolder mSurfaceHolder;private Camera camera = null;//该类的构造函数public CameraSurfaceView(Context context) {super(context);//初始化SurfaceHolderthis.mSurfaceHolder = this.getHolder();//mSurfaceView.getHolder()? how does it know?this.mSurfaceHolder.addCallback(this);this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);//设置SurfaceHolder类型}


我们来看mSurfaceHolder这个object是怎么实例化的:

this.mSurfaceHolder = this.getHolder();

getHolder的返回值又是什么呢?google给出的解释是:

考虑到mSurfaceHolder被作为参数传递到了surfaceCreated,surfaceChanged等方法里,我可以说这里的underlying surface是'当前surface'的意思,而不是什么'下面的surface'.

于是,mSurfaceHolder就成为了:access and control over the underlying surface

现在可以考虑mSurfaceHolder在surfaceCreated()方法里承担什么作用了:

surfaceCreated的google解释:

在哪个surface创建时被call呢?holder指向的surface.

done.

'外包'遇到问题了,详见论坛帖:http://topic.csdn.net/u/20110829/23/5a6dd78b-4696-4987-8090-0b45c95adaa7.html?81148  留在这里求解答

原创粉丝点击