我真的很依赖我的工作。我在 stackoverflow 上阅读了很多问题和答案,但我仍然无法找到适合我的确切答案。请帮助我,甚至只是指出我正确的方向......
我正在尝试编写一个应用程序,让我在使用相机时在屏幕上选择一个对象。
我会尝试以更简单的方式解释它: 我打开应用程序,相机实时屏幕显示,好像我正在录制的东西。我用手指在屏幕上选择3个特定点(这些是我之前准备的小彩色纸方块)。我的选择已保存到手机中。 (我会在此停止,因为我认为接下来发生的事情的进一步解释在这里并不重要。)
我不知道如何创建一个让我在屏幕上选择这些点的程序/代码。我现在所拥有的只是一个简单的代码,只能打开相机并让你录制视频。
请帮忙。
答案 0 :(得分:1)
你是开始视频输入的代码,我认为,获取一个Camera对象,启动它并将它连接到SurfaceView可能是SurfaceTexture。如果已设置:
,则Camera中的帧将直接显示到SurfaceViewmyHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
myCamera.setPreviewDisplay(myHolder);
这是显示相机帧的快速简便方法,但这意味着您无法控制帧的显示方式。例如,如果您想处理帧然后自己显示它们,则需要订阅onPreviewCallback()
,它会为您提供每个帧的副本。如果你然后省略了上面的两个surfaceview线,框架将不会自动显示,你可以自己绘制,但这会慢很多。 https://stackoverflow.com/a/4367250/514531
您可以使用Canvas在surfaceview上绘图。画布有许多绘制形状/矩形/线条/圆形/单词等方法。您可以使用Paint对象来指定颜色/宽度等。
我很抱歉,如果这是错误的,但我一直在使用较旧的Android,但是,如果您通过surfaceview进行显示,则无法将画布锁定到surfaceview。 https://stackoverflow.com/a/12565208/514531为了解决这个问题,我前段时间发现了一些创建OverlayView类的代码。在Android中,您可以在Z方向上将视图放在彼此的顶部。使用不使用myHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); myCamera.setPreviewDisplay(myHolder);
的空透明表面视图,您可以锁定一个canavs并开始绘制。
OverlayView类只是一个扩展SurfaceView的类,用作自定义显示。要执行此操作,您需要在布局文件中为第一个/相机活动声明它,如下所示:
<Your.package.OverlayView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/overView"
/>
<SurfaceView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/surfaceView"/>
在此布局文件中,R.id.surfaceView
是您第一次使用相机进行表面视图设置,就像您可能已经拥有的一样。 R.id.overView是绘图的自定义表面视图。
您可以像创建任何其他视图组件一样创建它:
OverLayView overView = (OverlayView)findViewById(R.id.overView);
这就像普通类一样,所以你可以像往常一样向它发送一些参数并在其上调用方法。例如,我有一个方法:
overView.setCamera(myCamera, cameraHeight, cameraWidth, getResources(), isFrontCamera);
现在您有一个显示到surfaceview的相机和一个可以绘制的单独的surfaceview。所以你现在需要一个TouchEvent处理程序。
在OverlayView类中重写方法onTouchEvent(MotionEvent e)
。 MotionEvent会告诉您发生了什么事件,触摸开/关。首先检查它是否为触地(按屏幕),然后您可以从MotionEvent e.getX
获取X和Y坐标;
这可以与canavs结合使用来绘制触摸发生的位置。
注意事项:相机预览的尺寸可能与surfaceview的尺寸不同。您知道相机对象的相机尺寸和surfaceview尺寸来自surfaceView onchange方法。因此,您需要计算转换比率的比率,例如:(viewWidth / touch)* camerawidth。
获得坐标后,您可以使用裁剪相机框架。