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

我一直在使用谷歌的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); } } } 

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

我能够通过切换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); } } 

我告诉你我们用于测量预览的代码,它支持4:3,16:9和1:1的预览尺寸。 高度是缩放的,因为应用程序是纵向阻挡,它不会旋转到横向。

希望它会帮助你或其他同样的问题!

 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); Log.d(TAG, "[onMeasure] Before transforming: " + width + "x" + height); int rotation = ((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation(); boolean isInHorizontal = Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation; int newWidth; int newHeight; Log.d(TAG, "[onMeasure] Get measured dimensions: " + getMeasuredWidth() + "x" + getMeasuredHeight()); if (isInHorizontal) { newHeight = getMeasuredHeight(); if (mAspectRatioOneOne) newWidth = getMeasuredHeight(); else newWidth = (int) (newHeight * mAspectRatio); } else { newWidth = getMeasuredWidth(); if (mAspectRatioOneOne) newHeight = getMeasuredWidth(); else newHeight = (int) (newWidth * mAspectRatio); } setMeasuredDimension(newWidth, newHeight); Log.d(TAG, "[onMeasure] After transforming: " + getMeasuredWidth() + "x" + getMeasuredHeight()); } 

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

但是,如果您的屏幕尺寸不是标准尺寸(基本上是16:9或4:3),特别是一旦您减去软按钮和通知栏(假设您没有完全全屏),那么预览填充屏幕的选项是削减一些。

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