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

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

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

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

以上


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

查看所有标签

猜你喜欢:

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

Professional JavaScript for Web Developers

Professional JavaScript for Web Developers

Nicholas C. Zakas / Wrox / 2009-1-14 / USD 49.99

This eagerly anticipated update to the breakout book on JavaScript offers you an in-depth look at the numerous advances to the techniques and technology of the JavaScript language. You'll see why Java......一起来看看 《Professional JavaScript for Web Developers》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具