当前位置: 首页 > news >正文

电影网站模板html不用流量的地图导航软件

电影网站模板html,不用流量的地图导航软件,长治市城乡建设局网站,深圳代理记账公司注册效果展示 一.概述 本博文讲解如何实现手机前后两颗摄像头同时预览并显示 我之前博文《OpenGLES#xff1a;GLSurfaceView实现Android Camera预览》对单颗摄像头预览做过详细讲解#xff0c;而前后双摄实现原理其实也并不复杂#xff0c;粗糙点说就是把单摄像头预览流程写两…效果展示 一.概述 本博文讲解如何实现手机前后两颗摄像头同时预览并显示 我之前博文《OpenGLESGLSurfaceView实现Android Camera预览》对单颗摄像头预览做过详细讲解而前后双摄实现原理其实也并不复杂粗糙点说就是把单摄像头预览流程写两遍。 与之前博文中使用GLSurfaceView实现相机预览不同这次前后双摄使用TextureView来完成 二.变量定义 2.1 公共变量 //权限 public static final int REQUEST_CAMERA_PERMISSION 1;private String mCameraId; private Size mPreviewSize; public final int mMaxImages 5;//相机状态信号量 private Semaphore mCameraOpenCloseLock new Semaphore(1);2.2 摄像头相关变量 ...private TextureView mFrontTextureView; private CameraCaptureSession mFrontCaptureSession;private TextureView mBackTextureView; private CameraCaptureSession mBackCaptureSession;... 两个CaptureSession、两个TextureView(也就是同时两个Surface) 三.OpenCamera() 在 onResume() 中先判断 TextureView 状态是否 Available() 如果是就 OpenCamera()如果不是就设置 SurfaceTexture 监听在 onSurfaceTextureAvailable() 监听回调中再OpenCamera() onResume()代码 Override public void onResume() {super.onResume();if (mBackTextureView.isAvailable()) {openCamera(true, mBackTextureView.getWidth(), mBackTextureView.getHeight());} else {mBackTextureView.setSurfaceTextureListener(mBackSurfaceTextureListener);}if (mFrontTextureView.isAvailable()) {openCamera(false, mFrontTextureView.getWidth(), mFrontTextureView.getHeight());} else {mFrontTextureView.setSurfaceTextureListener(mFrontSurfaceTextureListener);}startBackgroundThread(); }OpenCamera()时需要判断当前打开的是哪颗摄像头然后走各自对应的流程 OpenCamera()代码 private void openCamera(boolean isBack, int width, int height) {...if (isBack) {mCameraId manager.getCameraIdList()[0];//预览size先写成固定值mPreviewSize new Size(1440, 1080);mBackImageReader ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, mMaxImages);mBackImageReader.setOnImageAvailableListener(mOnImageAvailableListenerBack, mBackgroundHandler);Log.v(TAG, openCamera mCameraId mCameraId);manager.openCamera(mCameraId, mStateCallBack, mBackgroundHandler);} else {mCameraId manager.getCameraIdList()[1];//预览size先写成固定值mPreviewSize new Size(1080, 720);mFrontImageReader ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, mMaxImages);mFrontImageReader.setOnImageAvailableListener(mOnImageAvailableListenerFront, mFrontgroundHandler);Log.v(TAG, openCamera mCameraId mCameraId);manager.openCamera(mCameraId, mStateCallFront, mFrontgroundHandler);}...} 四.createCaptureSession() OpenCamera()之后分别为前后摄创建CaptureSession private void createCameraPreviewSession(boolean isBack) {try {if (isBack) {SurfaceTexture texture mBackTextureView.getSurfaceTexture();assert texture ! null;texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());ArrayListSurface surfaces new ArrayListSurface();Surface surface new Surface(texture);surfaces.add(surface);surfaces.add(mBackImageReader.getSurface());...mCameraDeviceBack.createCaptureSession(surfaces, mBackStateCallback, mBackgroundHandler);} else {SurfaceTexture texture mFrontTextureView.getSurfaceTexture();assert texture ! null;texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());ArrayListSurface surfaces new ArrayListSurface();Surface surface new Surface(texture);surfaces.add(surface);surfaces.add(mFrontImageReader.getSurface());...mCameraDeviceFront.createCaptureSession(surfaces, mFrontStateCallback, mFrontgroundHandler);}} catch (CameraAccessException e) {e.printStackTrace();} }五.setRepeatingRequest() createCaptureSession()之后在前后摄各自的状态回调StatCallback中调用setRepeatingRequest()启动预览。 前摄 CameraCaptureSession.StateCallback mFrontStateCallback new CameraCaptureSession.StateCallback() {Overridepublic void onConfigured(CameraCaptureSession session) {Log.v(TAG, CameraCaptureSession onConfigured);...mFrontCaptureSession session;try {...mFrontCaptureSession.setRepeatingRequest(mFrontPreviewRequest,mPreviewBackCallback, mBackgroundHandler);} catch (CameraAccessException e) {e.printStackTrace();}}Overridepublic void onConfigureFailed(CameraCaptureSession session) {Log.v(TAG, onConfigureFailed);showToast(onConfigureFailed);} }; 后摄 CameraCaptureSession.StateCallback mBackStateCallback new CameraCaptureSession.StateCallback() {Overridepublic void onConfigured(CameraCaptureSession session) {Log.v(TAG, CameraCaptureSession onConfigured);...mBackCaptureSession session;try {...mBackCaptureSession.setRepeatingRequest(mBackPreviewRequest,mPreviewFrontCallback, mFrontgroundHandler);} catch (CameraAccessException e) {e.printStackTrace();}}Overridepublic void onConfigureFailed(CameraCaptureSession session) {Log.v(TAG, onConfigureFailed);showToast(onConfigureFailed);} }; 六.注意 1.布局优化 本篇博文最开始展示了两种前后双摄效果 第一种是分屏显示前后摄预览各占1/2但是画面有压缩 第二种是重合显示前后摄预览重合在一起画面没有压缩但是有部分区域重叠覆盖 两种不同的显示方式其实只是两个TextureView在布局文件中不同的配置 (1).第一种是在两个TextureView控件外加了一层LinearLayout控件 ?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalLinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalTextureViewandroid:idid/texture_backandroid:layout_widthmatch_parentandroid:layout_height0dpandroid:layout_weight1/TextureViewandroid:idid/texture_frontandroid:layout_widthmatch_parentandroid:layout_height0dpandroid:layout_weight1//LinearLayout/androidx.constraintlayout.widget.ConstraintLayout (2).第二种去掉了LinearLayout且在源生TextureView基础上略微封装了一个自定义的AutoFitTextureView自动适配传入的显示区域宽高 ?xml version1.0 encodingutf-8? androidx.constraintlayout.widget.ConstraintLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalImageViewandroid:idid/iv_backgroundandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent /com.android.cameraapp.UiUtil.AutoFitTextureViewandroid:idid/texture_backandroid:layout_widthwrap_contentandroid:layout_heightwrap_contenttools:ignoreMissingConstraints /com.android.cameraapp.UiUtil.AutoFitTextureViewandroid:idid/texture_frontandroid:layout_widthwrap_contentandroid:layout_heightwrap_contenttools:ignoreMissingConstraints //androidx.constraintlayout.widget.ConstraintLayout 2.代码优化 如果看到这里证明你已经跟随博文实现了前后双摄回过头来看代码会发现比较简单粗糙就是博文开始时所述将单个摄像头预览开启流程重复了一遍。 这样的代码不简洁也不美观且不易于扩展可以使用工厂模式将功能代码抽象成一个Camera2Proxy这一过程就不在此复述了。 七.结束语 前后双摄的实现过程和关键代码讲解到此结束
http://www.eeditor.cn/news/123313/

相关文章:

  • 做网站侵权培训网站建设方案模板
  • 淮北建网站费用基金网站模板
  • 南通网站建设心得徽章设计制作小程序
  • 山东网站开发网络公司国家工商网企业查询官网
  • 阿里巴巴网站广告怎么做wordpress插件卸载
  • 上海营销型网站标准app网站开发框架
  • 哈尔滨做网站哪家好广州番禺职业技术学院
  • 大型门户网站开发费用上海网页设计公司山东济南兴田德润简介
  • 网站菜单导航制作教程哈尔滨关键词优化效果
  • 昆明网站建设一条龙服务广州住房和建设局网站
  • 手机网站在后台怎么做编辑什么网站ghost做的好
  • 做网站赤峰怎么制作网站封面
  • 投资公司网站模板郑州关键词网站优化排名
  • 北京定制网站建设公司学校网站建设 效果
  • 网站设计合同网页版游戏排行榜枪
  • 做网站复杂吗wordpress页面半透明
  • 泰和县城乡建设局网站wordpress 多主题插件
  • 下载建设银行官方网站下载安装做静态网站接单
  • 做网站要收订金吗电子购物网站建设
  • 上海网站建设公司联系方式网站上的图文介绍怎么做的
  • 临安市住房和建设局网站建筑公司取名参考
  • 陕西做网站电话男女做羞羞的事视频网站
  • 公司网站建设建议网上下载的html模板怎么修改
  • 建设银行网站的安全措施门户网站建设询价公告
  • 徐州如何选择网站建设福建省建设执业注册与管理中心网站
  • 怎么知道网站被k住房与建设管理局
  • 济南集团网站建设流程开放平台供稿人计划
  • 网站建设辶首选金手指十五directory wordpress
  • 滨州建网站公司做爰全过程免费的视频网站有声音
  • 域名服务器ip查询网站如何用ps做网站导航条