TL;DR:既然getDrawingCache()似乎会在启用硬件加速时触发View的完全重绘,那么是否有其他方法可以避免使用Bitmap (或其他类似的方法)来避免这种情况,比如在上次绘制View时将数据读入(硬件、软件)层?
一些背景:
从Android3.0开始,Android就有了镜像屏幕的能力,比如连接的HDMI显示器。这可以用于演示,但它意味着观众看到的东西和主持人一样,这并不总是理想的。
Android4.2增加了Presentation,允许应用程序在“第二个屏幕”上随意放置内容(例如,HDMI附加显示)。在这种情况下,有时,第二个屏幕显示主平板显示器上的部分内容将是有用的。如果你想到像微软PowerPoint,LibreOffice印象之类的演示软件,在典型的双屏幕设置中,观众会看到当前的演示幻灯片,而演示者则会看到当前的幻灯片以及计时器和演讲者的笔记和.
对于非交互式内容,如表示幻灯片的PNG,这只是在两个屏幕上显示相同的图像(以及主屏幕上的其他内容)的问题。
然而,对于交互式内容,如WebView,有时很难进行这种镜像。例如,我们无法很好地知道WebView的内容何时会发生变化,因为它可能完全基于WebView本身的内容(例如完成AJAX调用),而不是我们单独做的事情。而且,即使我们知道WebView的内容什么时候改变了,我们也没有办法让其他WebView呈现相同的内容。
因此,我想我应该尝试设置一个MirroringFrameLayout,它将使用getDrawingCache()检索容器内容的Bitmap,并将其传递给可以在屏幕上呈现的人(例如,在Presentation中显示的ImageView )。
但是,在启用硬件加速之后,setDrawingCacheEnabled(true) 在某种程度上是不可行的。
启用绘图缓存类似于在关闭硬件加速时设置一个层。当硬件加速打开时,启用绘图缓存对呈现没有影响,因为系统使用不同的加速机制,忽略标志。
在这些情况下,调用getDrawingCache()强制将View的完整draw()转换为位图支持的Canvas,而不是实际使用缓存。由于draw()可能很昂贵,经常执行draw() (例如,通过postOnAnimation()触发)会导致jank。
因此,我试图确定除了getDrawingCache()之外是否还有其他的“绘图缓存”,我们可以在启用硬件加速的情况下使用这些缓存来设置镜像,这是更有效的。据我所见,没有这样的缓存,因为从SDK应用程序的角度来看,层实际上是写的。不过,我希望我可能错过了一些解决办法。
提前感谢!
发布于 2013-03-21 15:31:56
您可以使用setLayerType(View.LAYER_TYPE_SOFTWARE, null),但是它会产生副作用,每次更新时都会使视图重新绘制的速度变慢。创建一个定制的ViewGroup,在两个画布上绘制视图(每个屏幕一个),效率要高得多。您也可以简单地使用一个ViewTreeObserver,并且在每次绘制回调时,强制您的视图在第二个屏幕上呈现。我确实建议您不要试图滥用这种用例的绘图缓存/图层类型。
https://stackoverflow.com/questions/15551150
复制相似问题