【问题标题】:How can a SurfaceView be put into a layered hierarchy of Views?如何将 SurfaceView 放入 View 的分层层次结构中?
【发布时间】:2012-06-15 15:27:31
【问题描述】:

我想在一层上一层上创建Views 的层次结构,大致如下:

框架布局{
表面视图
查看
查看
表面视图
查看
表面视图
}

我希望每个SurfaceView 的绘制事件都出现在层次结构中的正确位置。例如,顶面应该出现在所有东西的前面。底部的应该出现在所有内容的后面。

不幸的是,我可以使用setZOrderOnTop(true) 使每个表面出现在所有物体的前面,并且我可以通过不这样做使每个表面出现在底部,但我不能让一个表面出现在中间。如何做到这一点?

【问题讨论】:

  • 你不必使用FrameLayout,你可以在onCreate中使用addContentView()。我怀疑 Android 在这么多浏览量下会表现良好。一切都可以通过一两个视图来完成。
  • 我在一侧有一系列按钮,所以实际上我不能使用活动的根FrameLayout,但因为它是FrameLayout,所以这只是引出了问题。我的应用程序绝对要求我生成一个分层图形,其中的元素在相对静态的元素之间快速变化,因此我必须要么在 View 中实现复杂的自定义绘图,要么使用图层(最终自定义绘图将执行相同的处理)。
  • 由于只有一个视图可以进行触摸输入,而用户只能看到一个表面,所以一切都取决于绘图的层次结构。带有画布的单个自定义视图可以完成这项工作。虽然有时低于正常的 android 视图,但可以为动画背景放置一个自定义视图。所以我看不出任何应用程序需要两个以上的真实层......我很好奇你想做什么......
  • 我正在接收来自FrameLayout 的触摸事件,并根据需要将它们传递到表面;该应用程序基本上在三层中绘制,我使用SurfaceViews 处理活动绘图(需要快速更新)和其他Views 处理已绘制的元素(一旦它们停止被更改它们从SurfaceView 移动到View)。而不是每次都重绘所有内容或使用中间Bitmaps(我相信你知道内存问题)我有这个层次结构。
  • 是的,这是一种解决方案。您只需要检查帧速率并查看它的性能。我认为另一个视图为其画布占用另一个屏幕内存缓冲区。我知道处理内存有多么困难,因为我在市场上有一个使用大图像的应用程序 Kaleido-Magic...

标签: android surfaceview layer


【解决方案1】:

FrameLayout 设计用于在屏幕上屏蔽一个区域以显示单个项目。通常,FrameLayout 应该用于保存单个子视图,因为很难以一种可缩放到不同屏幕尺寸而又不相互重叠的方式来组织子视图。

我建议您改用LinearLayoutRelativeLayout

【讨论】:

  • 我想你误解了:我希望所有层都重叠。事实上,我希望它们实际上占据同一个矩形的不同层;此外,这工作得很好,除了 SurfaceView 元素要么在后面要么就在前面(我想要其中一个在中间)。
【解决方案2】:

在撰写本文时,这似乎是不可能的。

【讨论】:

  • 您是否尝试过 getHolder().setFormat(PixelFormat.TRANSLUCENT) 顶部的 SurfaceViews ?我只是在做一个相机覆盖......
  • 让它覆盖不是问题 - 问题是让不透明像素显示顶部元素,但底部的。
猜你喜欢
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2019-06-15
  • 2020-11-30
相关资源
最近更新 更多