Android中surface,surfaceview,sufaceholder以及surface客户端的关系
这里以照相机camera功能的实现来解释surface,surfaceview,sufaceholder以及surface客户端(本例子中指的是camera)的关系,surface及其client(客户端,本例子中指的是camera)之间的纽带就是surfaceholder,它控制着surface及其client(客户端,本例子中指的是camera)之间的连接or断开,surfaceView座位视图层级结构层面的组件,可以认为是它承载了surface,而surface是实际用来接收图像原始像素绘制的缓冲区。
当含有surfaceView的试图层级结构被放到屏幕上时surfaceCreated被调用,此时surfaceholder对surface及其客户端进行关联;
当surfaceView从屏幕上移除时调用surfaceDestroyed方法,也就意味着surface被销毁,surfaceholder断开surface及其客户端的联系;
当surface首次出现在屏幕上调用surfaceChanged方法,通过传入的参数,可以告诉客户端surface的像素格式以及surface的宽度和高度,告知客户端有多大的绘制区域可以使用。
具体的看一下例子:(这里只是截取了有关surface,surfaceview,sufaceholder以及surface客户端(本例子中指的是camera)的部分代码,相机功能的具体实现代码(camera.takePicture(Camera.ShutterCallback shutter,Camera.PictureCallback raw,Camera.PictureCallback jpeg)及其相关接口实现)没有放出来,对于相机功能实现有兴趣或有疑问的盆友可以留下邮箱),代码中的mCamera是一个Camera对象。
mSurfaceView=(SurfaceView)view.findViewById(R.id.crime_camera_surface);
//surfaceholder 是我们与surface(实际承载图像原始像素的缓冲区)对象联系的纽带
//实际上,surfaceholder是作为surface与surface的客户端之间的纽带的,因为要保证surface不存在时没有任何内容要在他上面进行
//绘制,所以需要一个“中间人”(surfaceholder)进行协调他们之间的关系。当surface创建完成时,surfaceholder链接客户端与
//surface保证他们进行交互,当surface销毁之后,surfaceholder断开surface及其客户端的联系。
SurfaceHolder holder=mSurfaceView.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//SurfaceHolder.Callback()用于监听surface的生命周期
holder.addCallback(new SurfaceHolder.Callback() {
//surfaceView从屏幕上移除时调用此方法,也就意味着surface被销毁,surfaceholder断开surface及其客户端的联系。
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(mCamera!=null){
//surface此时已经被销毁,通过stopPreview方法停止camera在surface上的绘制操作
mCamera.stopPreview();
}
}
//当含有surfaceView的试图层级结构被放到屏幕上时surfaceCreated被调用,此时surfaceholder对surface及其客户端进行关联
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try{
if(mCamera!=null){
//通过setPrevireDisplay链接camera和surface
mCamera.setPreviewDisplay(holder);
}
}catch(IOException e){
Log.e(TAG, "Setting up preview display failed", e);
}
}
//surface首次出现在屏幕上调用这个方法,通过传入的参数,可以告诉客户端surface的像素格式以及surface的宽度和高度,
//告知客户端有多大的绘制区域可以使用。
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
if(mCamera==null){
return;
}
Camera.Parameters parameters=mCamera.getParameters();
Size size=getBestSupportedSize(parameters.getSupportedPreviewSizes(), width, height);
parameters.setPreviewSize(size.width, size.height);
size=getBestSupportedSize(parameters.getSupportedPictureSizes(), width, height);
parameters.setPictureSize(size.width, size.height);
mCamera.setParameters(parameters);
try{
//通过startPreview方法告知可以在surface上进行绘制操作
mCamera.startPreview();
}catch(Exception e){
Log.e(TAG, "Start preview failed", e);
mCamera.release();
mCamera=null;
}
}
});
Android中surface,surfaceview,sufaceholder以及surface客户端的关系的更多相关文章
- Android进阶笔记08:Android 中Activity、Window和View之间的关系
1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutI ...
- Android中*_handle_t/ANativeWindowBuffer/ANativeWindow/GraphicBuffer/Surface的关系
在阅读SurfaceFlinger HardwareComposer以及gralloc相关代码的过程中,我们经常会遇到native_handle private_handle_t ANativeWin ...
- android中使用surfaceview+MediaPlayer播放视频
Android中播放视频主要有两种方式: 使用其自带的播放器.指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型 使用android自带的VideoView,这种方法 ...
- Android中Handler 、Thread和Runnable之间的关系
在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...
- Android中的APK,TASK,PROCESS,USERID之间的关系
开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...
- Android中使用SurfaceView+MediaPlayer+自定义的MediaController实现自定义的视屏播放器
效果图如下: (PS本来是要给大家穿gif动态图的,无奈太大了,没法上传) 功能实现:暂停,播放,快进,快退,全屏,退出全屏,等基本功能 实现的思路: 在主布局中放置一个SurfaceView,在Su ...
- Android中使用SurfaceView和Canvas来绘制动画
事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...
- Android中SurfaceView的使用详解
Android中SurfaceView的使用详解 http://blog.csdn.net/listening_music/article/details/6860786 Android NDK开发 ...
- Android中的Surface和SurfaceView
一.什么是Surface 简单的说Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都要画在Surface的Canvas上(后面有原因解释).传统的view共享一 ...
随机推荐
- 论php数组合并
注:尽量不要在循环中操作数据库. 1.两个一维数组合并成一个一维数组 $a = array('morning','afternoon','night'); $b = array('breakfast' ...
- python模块(shelve,xml,configparser,hashlib,logging)
1.1shelve模块 shelve 模块比pickle模块简单,只有一个open函数,返回类似字典对象,可读可写:key必须为字符串, 而值可以是python所支持的数据类型. shelve模块主要 ...
- CSS之表单元素
表单就是收集用户信息的,就是让用户填写的.选择的. 1 <div> 2 <h3>欢迎注册本网站&l ...
- WdatePicker小结
WdatePicker.js日期插件: 1. %y 当前年 %M 当前月 %d 当前日 %ld 本月最后一天 %H 当前时 %m 当前分 %s 当前秒 2.可以通过配置minD ...
- 数据结构之平衡查找树(AVL)
AVL树的旋转操作 图解 最详细 各大教课书上讲的都是左旋与右旋,其实这样很容易理解错误,我们换一种叫法.我们称呼左旋为:逆进针旋转.我们称呼右旋为:顺进针旋转.
- unity小地图技术方案总结
技术方案 一:从顶视图获取实时小地图(优点实现快容易对地图进行放大缩小操作而且地图,缺点是不好对地图做出修改,只能在顶部加个另外的相机层来遮盖) 1.创建Redertexture并改名为smallma ...
- PHP XML和数组互相转换
//数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) ...
- FSM(状态机)、HFSM(分层状态机)、BT(行为树)的区别
游戏人工智能AI中最常听见的就是这三个词拉: FSM 这个不用说拉,百度一大堆解释, 简单将就是将游戏AI行为分为一个一个的状态,状态与状态之间的过渡通过事件的触发来形成. 比如士兵的行为有“巡逻”, ...
- Subsonic使用中
使用中,遇到各种奇葩问题,依依汇总. 1.引用了Subsonic层后,一运行就开始报错,提示未能找到文件!! //引用后,目标框架可能会被改变,subsonic的默认框架是2.0,请检查框架是否 ...
- 菜鸟笔记:java变量命名及峰驼式命名法
如同酒店会给每个房间起个性化的名字一样,程序中的变量也需要用合理的名字进行管理---变量名! 需要注意,给酒店房间起名字时可以是数字,如"802",也可以是有趣的名字,如" ...