17

TL; DR:由于getDrawingCache()似乎在View启用硬件加速时触发了 a 的完全重绘,是否有另一种方法Bitmap可以通过读取填充到(硬件、软件)中的数据来避免这种情况(或类似的东西)View上次绘制的图层?


一些背景:

自 Android 3.0 以来,Android 已经能够镜像屏幕,例如连接到 HDMI 显示器。这可以用于演示,但这意味着观众看到的东西与演示者相同,这并不总是理想的。

Android 4.2 添加了Presentation,允许应用程序在“第二个屏幕”(例如,HDMI 连接的显示器)上放置任意内容。在这种情况下,有时,第二个屏幕显示主平板电脑显示屏上的部分内容会很有用。如果您想到 Microsoft PowerPoint、LibreOffice Impress 等演示软件,在典型的双屏设置中,观众会看到当前的演示幻灯片,而演示者会看到当前的幻灯片、计时器和演讲者备注以及...

对于非交互式内容,例如表示幻灯片的 PNG,这只是在两个屏幕上显示相同的图像(以及主屏幕上的其他内容)。

但是,对于像 a 这样的交互式内容,WebView有时很难进行这种镜像。例如,我们没有很好的方法知道 a 的内容何时WebView会改变,因为它可能完全基于自身内部的东西WebView(例如,AJAX 调用的完成),而不是我们单独做的事情。而且,即使我们确实知道内容何时WebView发生变化,我们也没有好的方法让其他WebView人渲染相同的内容。

所以我想我会尝试设置一个MirroringFrameLayoutgetDrawingCache()用于检索Bitmap容器的内容并将其传递给可以在屏幕上呈现它的人(例如,ImageView显示在 a 中Presentation)。

然而,在启用硬件加速的setDrawingCacheEnabled(true) 情况下,有点无操作

启用绘图缓存类似于关闭硬件加速时设置图层。打开硬件加速时,启用绘图缓存对渲染没有影响,因为系统使用不同的加速机制来忽略该标志。

在这些情况下调用getDrawingCache()会强制一个完整draw()View位图支持Canvas,而不是实际使用缓存。由于draw()可能很昂贵,因此draw()经常(例如,通过触发postOnAnimation())会导致卡顿。

因此,我试图确定是否还有其他一些“绘图缓存”,getDrawingCache()我们可以在启用硬件加速的情况下使用它,可以用来设置这个镜像,而且效率更高。据我所知,没有这样的缓存,因为从 SDK 应用程序的角度来看,层实际上是只写的。但是,我希望也许我错过了一些解决方案。

提前致谢!

4

1 回答 1

13

You can use setLayerType(View.LAYER_TYPE_SOFTWARE, null) but it will have the side effect of making that View slower to redraw every time it updates. It would be much more efficient to create a custom ViewGroup that draws your View on two Canvas (one for each screen.) You could also simply use a ViewTreeObserver and on every draw callback force your view to render on the second screen. I really recommend you don't try to abuse the drawing cache/layer type for such a use case.

于 2013-03-21T15:31:56.213 回答