安卓:是否可以在另一个SurfaceView上方有两个SurfaceView?

10
我的想法是使用两个SurfaceView。一个SurfaceView用于显示图片(称为 ImageSurfaceView),另一个位于它上面,用于显示注释,例如圆圈、矩形等(称为 AnnotationSurfaceView)。现在我需要将这些SurfaceView映射到一起,使它们的高度和宽度相同,并且两个SurfaceView都可以通过拖动来移动,即共享触摸事件。确切地说,当我向上移动图片时,注释也应该向上移动。
现在,我不确定在Android中是否有可能实现这一点。有人能告诉或分享一些信息吗?我没有任何具体的代码实现想法。此外,我找不到任何类似的内容。
感谢您的帮助。
1个回答

21

是的,这是可能的。您可以将两个SurfaceView作为FrameLayout的子项添加。您还需要在其中一个或两个SurfaceView上调用setZOrderMediaOverlay以指定它们的层次关系。

此外,您所描述的可能是一个图形密集型算法。请考虑添加AndroidManifest.xml application 属性android:hardwareAccelerated="true"

最后,只需设置自定义OnTouchListener以处理拖动事件。使用MotionEvent.getRawX()MotionEvent.getRawY()获取触摸点,并使用其来操作画布。


我无法将两个SurfaceView添加到FrameLayout中。它说,在添加另一个子项之前,我必须调用removeView()。此外,在设置android:HardwareEnabled="true"时,我遇到了另一个错误,它说“error:No resource identifier found for attribute 'HardwareEnabled' in package 'android'”。 - Shobhit
@Shobhit,这个属性是一个打字错误,我已经修复了。请尝试使用android:hardwareAccelerated="true"。至于你的第一个问题——这听起来像是你正在使用ScrollView。你能否将你的布局(XML或编程方式)添加到问题中? - Phil
嗨Phil,有一个小bug,现在我已经解决了,但只是部分地。我仍然需要实现自定义OnTouchListener。你有没有偶然间有任何示例代码的链接?如果有,请分享一下好吗?我会将当前代码发布为我的答案。谢谢! :) - Shobhit
@Shobhit,StackOverflow上有很多例子,但是这个看起来最有前途。 - Phil
我已成功编写了自定义的 onTouchListener. 我将在下面发布答案。但我想纠正你的一个地方。MotionEvent.getRawX/Y()(至少在我的情况下)会自动添加一些额外的数字到确切的触摸点,例如,有效的 x 是 touchpoint+200 ,有效的 y 是 touchpoint+50。然而,我使用了 MotionEvent.getX/Y(),这给了我确切的触摸点。我现在能够在两个 SurfaceView 中获取触摸点。我必须扩展自定义 onTouchListener 来完成我的需求。非常感谢您的帮助。 - Shobhit
2
一个小的补充:setZOrderMediaOverlay() 应该在 OnCreate() 中调用,否则它将没有任何效果。 - vovan888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接