一个可能的方向(如果您在 Android Studio 上)是从 GitHub here 提取代码,单步执行并根据您的需要进行修改。它当然不会“无论你的应用程序做什么”,但它可以让你脱离实际(或者可能会让你更加困惑)。请注意,它仅处理后凸轮。无论如何,前面有一点信息。
1/ 当您的活动开始 (onCreate) 时,记录其旋转并锁定它,以便在您重新定位手机时视图不会跳动。根据您的初始状态,您的方向可能是港口或陆地。您也可以“强制”它,例如 LAND,但是当您的活动开始时它会看起来很生涩。
2/ onSurfaceChanged 为您提供表面尺寸。它可以是 PORT (W H)。您将表面 W、H 发送给相机管理器以选择理想的预览尺寸。由于“getSupportedPreviewSizes”主要是(我想说总是,但不是 100% 肯定)类型 LAND(W > H),因此您已经相应地交换了表面 W 和 H。
3/ 不要忘记将“setDisplayOrientation”设置为您的初始方向,这样您的预览就不会横向显示。
4/ 几乎可以肯定,您的表面 W:H 与所提供的预览尺寸 W:H 不完全相同,从而导致压缩/拉伸预览(只需使用凸轮预览查看任何圆形对象)。所以现在你必须再次调整你的表面大小,请参阅“surfaceChanged”末尾的“setLayoutParams”。值得注意的是,您可以将您的表面调整为 FIT-IN(信箱),从而在两侧产生两条背景色条纹,或者 FILL(平移和扫描)用一些溢出的屏幕(谁在乎)填充您的整个表面区域。
这有助于您正确进行预览。我还应该提到,预览方向还有一个怪癖。某些平板电脑(Nexus 1Gen,...)具有自然方向 LAND,但有些(例如 SAMSUNG 8 3.0)具有 PORT。此问题在初始化期间进行了调整,并以“isLandTab”布尔值表示。
5/ 现在,当您最终从 Camera.getPicture 获取图片时,您只需使用与旋转预览相同的量将其旋转回来。相当昂贵的操作(内存方面)。您必须将其解压缩为位图,旋转并....做任何您想做的事情。再次压缩,显示,....
现在,当您终于摆脱了这种荒谬的咆哮时,您可能会问自己。将活动强制进入 LAND 不是更好吗?锁定它。在这种情况下,你
- 不必交换曲面 W,H
- 不必设置DisplayOrientation
- 得到图片后不用旋转。
您仍然需要调整表面视图大小以适应提供/选定预览的比例。
玩得开心,祝你好运