3

我目前正在开发一个使用设备相机拍摄照片和录制视频的 Android 应用程序。此应用程序必须在 API 级别 >= 8 (Froyo) 上运行。

到目前为止,我已经实现了基于 Android 示例的相机代码。它可以在<ADT folder>/sdk/samples/<android_version>/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java- 我按照“android 11”示例在相机和“android 8”之间切换。这意味着我的相机预览由SurfaceView包含在ViewGroup(CameraPreview类)中的 a 持有,该类又作为主要活动中的内容视图附加

问题是我不希望像 Android 那样显示相机预览。我的意思是:我希望预览适合其中一个屏幕尺寸并溢出另一个。Android 示例适合其中一种屏幕尺寸,而另一种则保持在屏幕边界内。

例如:让我们以一个屏幕尺寸为 480x800 的 Android 设备为例。我们选择 480x640 的预览尺寸。Android 会保持这个预览大小,因为它适合设备的屏幕:它会完全适合屏幕宽度,同时会上下显示两个黑色矩形(信箱)。在我的例子中,我将该预览放大 1.25,以便将其调整为 600x800(也就是说,使预览和相机的最长边都长 800)。然后我尝试通过将预览表面 ( surfaceView) 稍微向左移动来使预览居中。在这种情况下,最左边的水平坐标是 -60 和最上面的 0。

我的问题是我无法正确移动SurfaceView. 它已正确调整大小,但我无法将其移到左侧(屏幕外)。在 SO 上搜索,我发现了很多可能的解决方案,但没有一个对我有用。我确信这不应该那么困难,而且我一定做错了什么。

到目前为止,我已经尝试了一些解决方案,例如:

  • 按照 Android 示例,我将其调整大小的代码 -onMeasure函数 - 更改为:
if (width * previewHeight < height * previewWidth) {

    final int scaledChildWidth = previewWidth * height / previewHeight;

    child.layout( (width - scaledChildWidth) / 2, 0, (width + scaledChildWidth) / 2, height);


} else {

    final int scaledChildHeight = previewHeight * width / previewWidth;

    child.layout(0, (height - scaledChildHeight) / 2, width, (height + scaledChildHeight) / 2);

}

这可以正确地将预览调整为我要查找的尺寸,但是,虽然最左边的坐标应该是 -60,但它仍会继续从屏幕的左上角呈现。我只是在此处粘贴onMeasure功能更改,因为其余代码与我之前所说的 Android 示例文件夹中的相同。

  • 将 的父容器更改SurfaceView为 aScrollView并滚动预览。

  • ViewGroup对/ RelativeLayout/ FrameLayout/ LinearLayout/等使用负边距或填充。在这种情况下,我能够移动一些界面元素(我添加到布局中的其他按钮),但不能移动SurfaceView.

  • 试图设置clipChildrenclipToPadding为假。

  • 尝试使用centerInParent选项。

  • SurfaceView创建一个大小与(缩放的预览大小)相同的新父布局并居中。它也可以正确调整大小,但不会在屏幕上居中。

  • 使用AbsoluteLayout(是的,我知道它已被弃用;))

我现在不记得我尝试过的其他解决方案,但我认为这些是主要的。

似乎我无法阻止元素从屏幕的左上角开始。

当然,可以要求任何进一步的细节,我会尽快回答。在这一点上我真的陷入了困境,我将非常感谢提供的任何帮助。感谢大家花时间阅读本文 :)

编辑 1

我正在 Android 2.3.6 中测试这个应用程序。

4

1 回答 1

1

很长一段时间后回答,但我花了很多时间弄清楚这一点。

某些SurfaceViewandroid 设备上的(见下文)不能超出显示边界。如果是这样,它会移动并居中,如果它太大而无法容纳。如果选择的分辨率与您的显示尺寸不匹配,您必须添加填充或拉伸图像。这是事实。

其次,请务必选择与预览尺寸具有相同纵横比的图片尺寸,否则您将无法在图片中获得与预览中看到的完全相同的视口。如果差异不大,这在您的情况下可能无关紧要,但在我的情况下确实如此。

某些设备上的注意事项:我在旧的 HTC Desire S(Android 2.3)上遇到了这种情况。它可以与带有 Android 5.1 的三星 S5 一起正常工作。如果有人通过与此相关的信息(android 版本,或只是某些型号......)来改进答案,我会很高兴。

于 2015-09-09T11:02:37.810 回答