我目前正在开发一款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,我发现了很多可能的解决方案,但没有一个适合我。我确信这不应该那么困难,我一定做错了。
到目前为止,我已尝试过一些解决方案,例如:
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
。
尝试将clipToPadding
和centerInParent
设为false。
尝试使用SurfaceView
选项。
创建一个新的父版面,其大小与AbsoluteLayout
(缩放的预览尺寸)的大小相同并居中。它也可以正确调整大小,但不会在屏幕上居中。
使用{{1}}(是的,我知道它已被弃用;)
我现在不记得我试过的其他解决方案,但我认为这些是主要的解决方案。
我似乎无法阻止元素从屏幕左上角开始。
当然,可以要求任何进一步的细节,我会尽快回答。我真的陷入了困境,我非常感谢你提供的任何帮助。 感谢所有花时间阅读此内容:)
修改1
我正在Android 2.3.6中测试此应用程序。
答案 0 :(得分:0)
很长一段时间后回答,但我花了很多时间搞清楚这一点。
某些 Android设备上的SurfaceView
(见下文)无法超出显示边界。如果确实如此,它会移动并居中,如果它太大而不适合。如果所选分辨率与您的显示尺寸不匹配,则您必须添加填充或拉伸图像。这是事实。
其次,请务必选择与预览尺寸具有相同宽高比的图片尺寸,否则您将无法在预览中看到图片中完全相同的视口。在你的情况下,这可能无关紧要,如果差异不大,但在我的情况下确实如此。
关于某些设备的注意事项:我在旧的HTC Desire S(使用Android 2.3)上遇到过这种情况。三星S5搭配Android 5.1,效果与预期一致。如果有人通过信息(Android版本或某些模型......)改进了答案,我会很高兴。