Camera2挖坑日记---如何解决预览画面变形

栏目: Android · 发布时间: 5年前

内容简介:一般情况下,今天主要是记录一下, 在使用

Camera2 是目前Android相机开发最新的API,旧版本的 Camera 已经被废弃了。

一般情况下, Camera2 的使用是将图像发送到 SurfaceView 或者 TextureView【通过SurfaceTexture】 来预览。使用JPEG或者Raw sensor格式的ImageReader来捕获JPEG图像或RAW缓冲区。 【注1】

今天主要是记录一下, 在使用 Camera2 API开发Android相机过程中,解决预览画面变形的问题。

另,本文所记录的情况,都是竖屏情况的设备。

题主参考Google方法给出的Demo,自定义了 TextureView ,可以自动适配宽高,支持全屏展示。代码地址 AutoFitTextureView

效果

以下的画面基本上处于同一角度拍摄所得

  • 变形的画面

    Camera2挖坑日记---如何解决预览画面变形
  • 正常的小画面,以宽为基准计算高度。

    Camera2挖坑日记---如何解决预览画面变形
  • 正常全屏画面,高度铺满屏幕,画面被拉近。

    Camera2挖坑日记---如何解决预览画面变形

解决

++在解决方案上,主要参考了Google官方给出的Demo。 Camera2VideoFragment ++。

Camera2 的使用上,我使用了 TextureView 作为预览画面的承载。为什么不使用 SurfaceView 呢?因为 SurfaceView 是基于Window层面的View,有很多View的属性都用不了,使用起来比较麻烦。

Camera2 API会返回一系列可以用于输出到 SurfaceTexture 的Size集合。--++TextureView显示原理即是使用SurfaceTexture构建的Surface++

Camera2挖坑日记---如何解决预览画面变形

如图:

以题主手上的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 ,感兴趣的童鞋可以去看一下。

以上


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法之道

算法之道

邹恒明 / 机械工业出版社 / 2010-2 / 39.00元

《算法之道》追求的目标是算法背后的逻辑,是一本启示书,而不是一本包罗万象的算法大全。因此,《算法之道》甄选了那些最能够展现算法思想、战略和精华,并能够有效训练算法思维的内容。《算法之道》将算法的讨论分为五大部分:算法基础篇、算法设计篇、算法分析篇、经典算法篇、难解与无解篇。每一个部分分别讨论算法的一大方面:基础、设计、分析、经典和难解问题。 《算法之道》既可以作为大学本科或研究生的算法教材或......一起来看看 《算法之道》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具