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
人渲染相同的内容。
所以我想我会尝试设置一个MirroringFrameLayout
,getDrawingCache()
用于检索Bitmap
容器的内容并将其传递给可以在屏幕上呈现它的人(例如,ImageView
显示在 a 中Presentation
)。
然而,在启用硬件加速的setDrawingCacheEnabled(true)
情况下,有点无操作:
启用绘图缓存类似于关闭硬件加速时设置图层。打开硬件加速时,启用绘图缓存对渲染没有影响,因为系统使用不同的加速机制来忽略该标志。
在这些情况下调用getDrawingCache()
会强制一个完整draw()
的View
位图支持Canvas
,而不是实际使用缓存。由于draw()
可能很昂贵,因此draw()
经常(例如,通过触发postOnAnimation()
)会导致卡顿。
因此,我试图确定是否还有其他一些“绘图缓存”,getDrawingCache()
我们可以在启用硬件加速的情况下使用它,可以用来设置这个镜像,而且效率更高。据我所知,没有这样的缓存,因为从 SDK 应用程序的角度来看,层实际上是只写的。但是,我希望也许我错过了一些解决方案。
提前致谢!