我看到很多人希望拍摄肖像照片,告诉他们将相机旋转90度。然而,无论我尝试什么,实际上“旋转”的唯一的东西是相机拍摄的图像,但它保留了它的宽度和高度比例,所以会发生的情况是,如果SurfaceView很窄并且图像不会失真高。
我想要的是拍摄一张4x3照片,这张照片不会在3x4布局中扭曲。我知道它会相当狭窄,但目标是旋转预览视图-90度并保持相机的正常宽高比。就目前而言,如果我想将照片定位在我的肖像布局上,我所尝试的一切都会导致图像被压扁。
我开始怀疑我需要在预览中应用矩阵,将其旋转-90度,但我不知道如何去做,或者这实际上是正确的方法。会喜欢一些建议。
编辑:要清楚这里是javadocs的相关摘录:setPreviewSize()“如果显示方向设置为0或180,预览大小应设置为480x320。如果显示方向设置为90或270 ,预览大小应设置为320x480。“
完全无法解决您希望将设备保持在纵向模式但将相机预览显示在小景观窗口中的情况(这是我正在尝试实现的)。
TIA
答案 0 :(得分:3)
如果您使用SurfaceView显示相机预览输出,并且您希望确保预览不会在预览或横向上失真,则必须确保SurfaceView的宽高比与宽高比相匹配相机预览尺寸。 SurfaceView将简单地缩放预览以适应其内部,因此如果预览尺寸为640x480时预览为500x500,则预览将显示为垂直拉伸。
概念上最简单的方法是简单地手动设置SurfaceView的宽度和高度,方法是将SurfaceView的布局更新为具有LayoutParams和setLayoutParams的固定大小的布局。这种方法的问题在于它可能会因屏幕尺寸不同而变脆,因为你需要弄清楚你想要的像素大小,以及在Android上直观的跨设备布局,你真的想在dp中思考而不是像素。但是对于测试,您可以强制SurfaceView具有测试设备屏幕的宽度,并通过
设置高度surface height = preview height / preview width * surface width
更好的方法是创建一个从SurfaceView继承的新类,它在View的onMeasure方法中进行必要的宽高比调整。详细解释这个问题很长,但请查看Android开发人员网站上的custom components documentation以获取详细信息。但粗略地说,您需要设置宽度/高度值,这些值始终与您配置的相机预览尺寸具有相同的宽高比。
一旦你有了正确大小的surfaceView,你通常还需要用setDisplayOrientation旋转相机预览输出;计算方向数学可能会令人困惑,因此请使用上面文档链接中提供的代码示例来解决问题。
基本上,世界上有一个坐标系,相机传感器有另一个(固定在设备上),UI系统有第三个(固定在你当前的方位),这三个都可能相互变化。虽然正确的预览方向不依赖于设备相对于世界的位置,但相机拍摄的照片的方向确实如此(由setRotation设置)。
答案 1 :(得分:-6)
我的建议是,
不要在Android上尝试更多关于布局,这很难做到这一点如果你想要实现,你必须阅读Android的开源代码,并且应该自行改变。
所以,我建议你使用Canvas(Import Graphics包)并使用这些类。