我目前正在开发一个使用设备相机拍摄照片和录制视频的 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
.试图设置
clipChildren
和clipToPadding
为假。尝试使用
centerInParent
选项。SurfaceView
创建一个大小与(缩放的预览大小)相同的新父布局并居中。它也可以正确调整大小,但不会在屏幕上居中。使用
AbsoluteLayout
(是的,我知道它已被弃用;))
我现在不记得我尝试过的其他解决方案,但我认为这些是主要的。
似乎我无法阻止元素从屏幕的左上角开始。
当然,可以要求任何进一步的细节,我会尽快回答。在这一点上我真的陷入了困境,我将非常感谢提供的任何帮助。感谢大家花时间阅读本文 :)
编辑 1
我正在 Android 2.3.6 中测试这个应用程序。