android textureview全屏预览,正确的宽高比

Edm*_*jas 13 java android android-camera android-textureview android-camera2

我一直在使用谷歌camera2 api演示,不幸的是,示例应用程序是为了在屏幕高度的大约70%处显示纹理视图预览,在环顾四周之后,我能够确定这是由AutoFitTextureView覆盖了onMeasure()方法如下图所示:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    if (0 == mRatioWidth || 0 == mRatioHeight) {
        setMeasuredDimension(width, height);
    } else {
        if (width < height * mRatioWidth / mRatioHeight) {
            setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
        } else {
            setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试通过设置正确的高度和宽度来纠正这个setMeasuredDimension(width, height);问题,这解决了高度问题,并从纹理视图中给我一个全屏预览,但是在每个设备上宽高比完全被破坏和翘曲,标准的固定方式是什么这个?我看到很多应用程序在Play商店找到了解决这个问题的方法,但还没能找到解决方案,任何帮助都会有很长的路要走,谢谢.

Edm*_*jas 17

我能够通过切换setMeasuredDimension()来解决问题;

    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    if (0 == mRatioWidth || 0 == mRatioHeight) {
        setMeasuredDimension(width, height);
    } else {
        if (width < height * mRatioWidth / mRatioHeight) {
            setMeasuredDimension(height * mRatioWidth / mRatioHeight, height);
        } else {
            setMeasuredDimension(width, width * mRatioHeight / mRatioWidth);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记在 xml 中将视图高度和宽度设置为“wrap_content” (2认同)

Edd*_*ala 0

如果您想要全屏、不失真的预览,则必须为相机选择与屏幕宽高比相匹配的预览分辨率。

但是,如果您的屏幕尺寸不是标准尺寸(基本上是 16:9 或 4:3),特别是当您减去软按钮和通知栏(假设您不是完全全屏)时,那么唯一的选择就是让预览充满屏幕的选项是剪掉其中的一部分。

您应该能够通过查看视图的宽度和高度以及选定的预览宽度和高度来修改TextureView的变换矩阵以消除失真,但这必然会切断其中的一些失真。