内容简介:一般情况下,今天主要是记录一下, 在使用
Camera2
是目前Android相机开发最新的API,旧版本的 Camera
已经被废弃了。
一般情况下, Camera2
的使用是将图像发送到 SurfaceView
或者 TextureView【通过SurfaceTexture】
来预览。使用JPEG或者Raw sensor格式的ImageReader来捕获JPEG图像或RAW缓冲区。 【注1】
今天主要是记录一下, 在使用 Camera2
API开发Android相机过程中,解决预览画面变形的问题。
另,本文所记录的情况,都是竖屏情况的设备。
题主参考Google方法给出的Demo,自定义了 TextureView
,可以自动适配宽高,支持全屏展示。代码地址 AutoFitTextureView
效果
以下的画面基本上处于同一角度拍摄所得
-
变形的画面
-
正常的小画面,以宽为基准计算高度。
-
正常全屏画面,高度铺满屏幕,画面被拉近。
解决
++在解决方案上,主要参考了Google官方给出的Demo。 Camera2VideoFragment ++。
在 Camera2
的使用上,我使用了 TextureView
作为预览画面的承载。为什么不使用 SurfaceView
呢?因为 SurfaceView
是基于Window层面的View,有很多View的属性都用不了,使用起来比较麻烦。
Camera2
API会返回一系列可以用于输出到 SurfaceTexture
的Size集合。--++TextureView显示原理即是使用SurfaceTexture构建的Surface++
如图:
以题主手上的Oppo r15为例,总共会返回13个可以用作输出的size
需要注意的是,如果以竖屏为例,这里的宽高是反过来的
在得到可用的size集合后,根据实际开发情况选择合适的PreviewSize即可
正常小画面展示
选定了一个合适的PreviewSize之后,只需要适配 TextureView
的宽高即可。小画面以宽为基准,需要根据屏幕宽度来计算相应的高度即可。这一部分的代码,在官方Demo里已经相当详细。其实很简单,就是自电影AutoFitTextureView里的 onMeasure
函数里,重新设定宽高。
override fun onMeasure(....){ if (width < ((height * ratioWidth) / ratioHeight)) { // 控件本身的宽小于根据比例计算来得宽,则使用控件本身的宽 setMeasuredDimension(width, (width * ratioHeight) / ratioWidth) } else { setMeasuredDimension((height * ratioWidth) / ratioHeight, height) } } 复制代码
其中ratioWidth、ratioHeight即是PreviewSize
全屏展示
全屏展示预览画面,则需要使用 TextureView
的另一个函数—— setTransform
。这个函数是给 Textureview
设置一个Transform,用于改变 TextureView
的画面。By,双指缩放时可以使用这个函数。
全屏展示时, TextureView
的宽高铺满整个屏幕,相应的我们只需要改变一下 Transform
即可,此时高度不变,但是要将画面的宽度放大。放大的倍数即为屏幕的高度除以小画面时计算得来的高度比例即可。
还是在 onMeasure
函数内:
override fun onmeasure(...){ val w = resources.displayMetrics.widthPixels val h = resources.displayMetrics.heightPixels setMeasuredDimension(w, h) fullScreenTransform.reset() fullScreenTransform.set(defTransform) // 宽拉伸,高不变 fullScreenTransform.postScale(h.toFloat() /ratioHeight, 1f, w * 0.5f, h * 0.5f) setTransform(fullScreenTransform) } 复制代码
其中fullScreenTransform即为TextureView最初始的Transform
自定义TextureView
题主将 AutoFitTextureView
重新封装了一下,对外提供了全屏展示的开关函数。地址在这里 AutoFitTextureView ,感兴趣的童鞋可以去看一下。
以上
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 年中记录与挖坑
- 小程序挖坑之路
- Angular 从入坑到挖坑 - 表单控件概览
- Angular 从入坑到挖坑 - HTTP 请求概览
- 能量视角下的GAN模型:GAN=“挖坑”+“跳坑”
- 【Vue】VueCli3 + Vue + typescript 挖坑记
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计算群体智能基础
恩格尔伯里特 / 谭营 / 2009-10 / 69.00元
《计算群体智能基础》全面系统地介绍了计算群体智能中的粒子群优化(PSO)和蚁群优化(ACO)的基本概念、基本模型、理论分析及其应用。在简要介绍基本优化理论和总结各类优化问题之后,重点介绍了社会网络结构如何在个体间交换信息以及个体聚集行为如何形成一个功能强大的有机体。在概述了进化计算后,重点论述了粒子群优化和蚁群优化的基本模型及其各种变体,给出了分析粒子群优化模型的一种通用方法,证明了基于蚂蚁行为实......一起来看看 《计算群体智能基础》 这本书的介绍吧!