【问题标题】:Handling camera and user rotation处理相机和用户旋转
【发布时间】:2015-03-16 18:55:19
【问题描述】:

我已经经历了很多答案,但是代码太多,我不知道该选择哪个方向。我希望有人能指出我正确的方向。

我有自定义相机应用程序,我在其中显示前置或后置摄像头的预览 (SurfaceHolder)。我有一个按钮,用户可以将预览图像旋转 90/180/270 度。该值被保存并应用于相机和预览图像。

但是用户拍照时出来的图像的方向是不一样的。我的问题是:如何考虑用户和设备方向,以使输出图像与预览图像旋转相同?

【问题讨论】:

    标签: android camera android-camera android-orientation


    【解决方案1】:

    一个可能的方向(如果您在 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 不是更好吗?锁定它。在这种情况下,你

    1. 不必交换曲面 W,H
    2. 不必设置DisplayOrientation
    3. 得到图片后不用旋转。

    您仍然需要调整表面视图大小以适应提供/选定预览的比例。

    玩得开心,祝你好运

    【讨论】:

      猜你喜欢
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多