将surfaceView(带摄像头预览)移动到屏幕左侧

时间:2013-10-16 12:24:50

标签: android android-camera surfaceview

我目前正在开发一款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 surfaceView类)中,而又作为主要活动中的内容视图

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

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

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

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

  • 按照Android示例,我将其调整大小的代码 - 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); } 功能 - 更改为:
onMeasure

这会正确地将预览调整为我要查找的尺寸,但是,尽管最左边的坐标应该是-60,但它仍然会从屏幕的左上角渲染。我只是粘贴SurfaceView函数的变化,因为其余的代码与我之前说过的Android示例文件夹中的代码相同。

  • ScrollView的父容器更改为ViewGroup并滚动预览。

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

  • 尝试将clipToPaddingcenterInParent设为false。

  • 尝试使用SurfaceView选项。

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

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

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

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

当然,可以要求任何进一步的细节,我会尽快回答。我真的陷入了困境,我非常感谢你提供的任何帮助。 感谢所有花时间阅读此内容:)

修改1

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

1 个答案:

答案 0 :(得分:0)

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

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

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

关于某些设备的注意事项:我在旧的HTC Desire S(使用Android 2.3)上遇到过这种情况。三星S5搭配Android 5.1,效果与预期一致。如果有人通过信息(Android版本或某些模型......)改进了答案,我会很高兴。