【发布时间】:2018-06-17 20:27:30
【问题描述】:
我有一个对话框设计,其中相机预览应该是纵向模式下的横向(参见图片)。我通过 getOptimalPreviewSize() 正确选择预览大小,当我不使用 setDisplayOrientation(90) 时,我得到了这个:
当我使用 setDisplayOrientation(90) 时,我得到了这个:
有人知道如何解决它吗?安卓能做那种事吗?
回答(感谢 Eddy Talvala):
由于当您在 xml 中的凸轮视图是水平的时,您无法纵向处理整个凸轮图片,您应该裁剪。我决定水平放置并在底部裁剪所有内容:
| |
| _________ | _____
|| || | |
|| || | ^-^ |
|| ______ || | \_/ |
|| | ^-^ ||| | | |
|| |_\_/_ ||| |__|__|
|| image || sensor
|| ||
|| ||
||_________||
|| < O [] ||
|___________|
device
您应该使用 TextureView 来指定适合和裁剪的矩阵。类似的东西(kotlin):
fun camInit() {
val camParam = camera.parameters
val optimalSize = getOptimalPortraitPreviewSize(camParam.supportedPreviewSizes, width, height)
camParam.setPreviewSize(optimalSize.width, optimalSize.height)
camera.parameters = camParam
camera.setPreviewTexture(surface)
val scaleDelta = optimalSize.height - preview.width // for portrait
val scaleY: Float = (optimalSize.width.toFloat() - scaleDelta) / preview.height // for portrait
val matrix = Matrix()
matrix.setScale(1f, scaleY) // 1f cause we fit horizontally
preview.setTransform(matrix)
camera.startPreview()
}
请注意,对于纵向模式,您应该使用特定的 getOptimalProtraitPreviewSize(),因为每个人用来获得相机预览最佳尺寸的标准函数(使用 ASPECT_TOLERANCE 和其他东西)可以返回一个小分辨率的尺寸。试试这样的:
fun getOptimalPortraitPreviewSize(sizes: List<Camera.Size>, previewWidth: Int) {
var selectedSize: Camera.Size = sizes[0]
for (size in sizes) {
// use size's height cause of portrait
val currentSizeWidthDelta = abs(size.height - previewWidth)
val selectedSizeWidthDelta = abs(selectedSize.height - previewWidth)
if (currentSizeWidthDelta < selectedSizeWidthDelta) selectedSize = size
}
return selectedSize
}
【问题讨论】:
-
我想达到同样的效果,但我做不到。我已按照您的回答,但没有达到预期的结果。非常感谢任何帮助。
-
@WaqasAhmedAnsari 你遇到了什么问题?
标签: android android-camera surfaceview landscape-portrait