0

我对要构建的 UI 控件有以下要求。经过几天摆弄各种方法后,我决定打开这个问题,看看在 Android 中是否真的没有比自己编写一个非常高级的组件来处理所有这些行为更好的方法来实现这种行为。

要求

  • 有一个给定的数据项列表,我需要将其排列在可滚动表面内的屏幕上。
  • 表面的虚拟大小是预先知道的,并且可能在水平和垂直方向上都超过视口/屏幕。
  • 每个数据项的实际大小和绝对位置都是预先知道的。
  • 数据项有一个 z-index 来指示它们所在的“层”。
  • 用户应该能够在此可用表面内滚动以浏览数据项。
  • UI 元素(视图)应该被虚拟化:当数据项即将在屏幕上变得可见时,数据项的 UI 元素会动态创建,而当它们变得不可见时,UI 元素可能会再次被销毁。
  • 每个数据项都可能基于数据创建特定的 UI 元素。
  • 我需要能够使用平滑滚动方法以编程方式水平/垂直滚动。
  • 可选:在某些时候,用户还应该能够在此区域内进行缩放,以使 UI 元素更大/更小。

尝试 1 我从一个ViewGroup包裹在一个ScrollView和中的自定义开始HorizontalScrollView。但是这种方法缺乏任何虚拟化方面。此外,嵌套多个 ScrollView 的需要使得处理状态容易出错。

尝试 2 然后我跌跌撞撞地RecyclerView尝试采用各种开源LayoutManagers,比如这个列表中的那些。但回收方法在RecyclerView很大程度上依赖于被重用的实际 UI 元素。视图被合并和重用,并且对于布局视图,通常已经创建并完全布局以确定排列。

尝试 3 我也尝试实现完全自定义LayoutManager,但由于回收性质不完全适合我的用例,很难满足 RecyclerView 做正确的事情。

这个的实际用例是: 我有一个音乐雕刻引擎其中输出是组成整个乐谱的一堆图像。所有的布局和渲染都在这个引擎中发生,独立于任何 UI 层。此外,音乐表可以对这些图像进行各种叠加,例如显示当前播放位置的光标或用户的自定义范围选择。所有这些元素都需要以性能最佳的方式显示在屏幕上。需要虚拟化来优化内存消耗,将所有图像完全保留在内存中非常昂贵,并且很容易达到 GB 的内存。为了解决这个问题,我将图像编码为 PNG,这会消耗一点 CPU,但可以保护内存。如它们所示,它们被再次解码以供显示。当PNG仍然“非常遥远”时,我什至想将它们保存到缓存目录

可比较的用例是:

  • 一个地图应用程序,其中包含所有图像作为图块,还有其他覆盖,如路径或标记。用户可以滚动、缩放等,并根据每个元素的数据有效地适应 UI
  • 您可以在大型虚拟表面上滚动并在其上放置物品的游戏。游戏状态是数据,而 UI 元素将是 ImageView 和其他要与之交互的 UI 元素。
  • WebView 还具有由不同引擎布局的元素,可基于此布局进行滚动,并且每个元素在渲染时可能以特殊方式显示在 UI 上。
4

0 回答 0