#1 大约理解一下他们俩:
SurfaceView继承自View,从单词意思也可以看得出来它是显示用的,它相当于一个布局配置文件,
所以可以这样:定义一个MySurfaceView extends SurfaceView,然后在Activity的onCreate()方法中,
不是有这句吗:setContentView(R.layout.某个布局xml文件); 那么,现在就可以改成是:setContentView(new MySurfaceView());
而且,SurfaceView一般多用于表示2d图形多些!
SurfaceHolder可以理解成是某个SurfaceView的“管理类”,即:每个SurfaceView通过它的getHolder()方法都可以获得一个
SurfaceHolder对象,比如: SurfaceHolder hoder = mySurView.getHolder();
那么,Holder类怎么管理Surface类呢,或者说可以管理什么呢?比如:holder可以从Surface上取一张画布过来,然后在画布上
画画,然后这个Surface的图案就变成了刚刚画的内容!即Holder可以改变Surface的图案;
holder还可以“监视”Surface的图案变化情况,只要让holder.addCallback(这里new一个SurfaceHolder.Callback的实现类对象);
并且在SurfaceHolder.Callback类的实现类对象中实现这3个方法:
surfaceCreated、surfaceDestroyed、surfaceChanged,
那么,这个hoder就可以实时监听这个Surface的状态,当Surface第一次加载时就会执行surfaceCreated方法,显然,由于是
从无到有,所以,Surface肯定也变化了,所以也会执行surfaceChanged方法,而且,以后Surface只要变化了那么就会自动
触发一次surfaceChanged方法,当Surface消亡时触发surfaceDestroyed方法!
#2 一般会这样使用他们俩(不这样也可以,但你会发现各种传参数不方便!):
一般在定义某个MySurfaceView时,他不是继承自SurfaceView吗,
而且到时候不是会让他的holder对象addCallback(这里new一个SurfaceHolder.Callback的实现类对象)吗,
就意味着要重新定义一个新的类实现SurfaceHolder.Callback,那么,我这里就让我的MySurfaceView亲自
继承自他,到时候我的holder对象.addCallback时,就很显然可以看到:在MySurfaceView类中:holder.addCallback(this);
所以,以后的套路一般是在定义某个SurfaceView的子类时:class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {}
如果你想要给Surface绘一个图,可能这个绘图操作很长时间,那么,一般做法是在一个子线程中去画图,什么时候启动这个子线程呢?在
surfaceCreated()方法中启动这个子线程,因为这个方法必然会执行的!那么,怎么在这个SurfaceView中画图呢,前面说过holder可以拿到它的画布,
所以,,,,可以实现让SurfaceView的图案改变!如果让当前Activity的setContentView() = 当前MySurfaceView对象,那么,就可以,,,,,
而且,如果holder在画图时每隔一段时间画一次则图案会定期改变吧!
如果你想在图案改变时做一些事情也可以实现:事先写好surfaceChanged方法即可!当然你也可以什么都不做,随你!
上面注意几点:
第一,在交给子线程绘图时,一定要把holder对象带过去,否则给谁绘图呢?
第二,在以后使用holder的过程中,尤其是摄像头方面的时候,可能经常会看到这句代码:
holder.setType(SURFACE_TYPE_PUSH_BUFFERS); 这句话的意思是什么呢?
SURFACE_TYPE_PUSH_BUFFERS表明该Surface不包含原生数据,Surface用到的数据由其他对象提供,
在Camera图像预览中就使用该类型的Surface,由Camera负责提供给预览Surface数据,这样图像预览会比较流畅
#3 看一个简单的例子,关于SurfaceView和SurfaceHolder用法的:http://blog.csdn.net/andyhuabing/article/details/7657069