TL;DR:自从getDrawingCache()
似乎触发了一个完整的重绘View
当启用硬件加速时,是否有其他方法获得Bitmap
(或类似的东西)可以避免这种情况,也许是通过读取填充到(硬件,软件)层的数据View
最后被抽到了?
一些背景:
自 Android 3.0 起,Android 就能够镜像屏幕,例如连接到 HDMI 显示器。这可以用于演示,但这意味着观众看到的内容与演示者相同,这并不总是理想的。
新增安卓4.2Presentation
,允许应用程序在“第二屏幕”(例如 HDMI 连接的显示器)上放置任意内容。在这种情况下,有时显示第二个屏幕会很有用part主平板电脑显示屏上的内容。如果您想到 Microsoft PowerPoint、LibreOffice Impress 等演示软件,在典型的双屏设置中,观众会看到当前的演示幻灯片,而演示者会看到当前的幻灯片以及计时器和演讲者注释……
对于非交互式内容,例如代表幻灯片的 PNG,这只是在两个屏幕上显示相同图像(以及主屏幕上的其他内容)的问题。
但是,对于交互式内容,例如WebView
,有时很难进行这种镜像。例如,我们没有很好的方法来知道什么时候WebView
可能会改变,因为它可能纯粹基于WebView
它本身(例如,AJAX 调用的完成),而不是我们单独执行的操作。而且,即使我们did知道什么时候的内容WebView
改变了,我们没有好办法得到其他的WebView
呈现相同的内容。
所以我想我会尝试建立一个MirroringFrameLayout
,这将使用getDrawingCache()
检索一个Bitmap
容器内容并将其交付给可以将其呈现在屏幕上的人员(例如,ImageView
显示在一个Presentation
).
然而,在启用硬件加速的情况下,setDrawingCacheEnabled(true)
有点无操作 http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29:
启用绘图缓存与关闭硬件加速时设置图层类似。当硬件加速打开时,启用绘图缓存对渲染没有影响,因为系统使用不同的加速机制来忽略该标志。
Calling getDrawingCache()
在这些情况下强制完全draw()
of the View
到位图支持的Canvas
,而不是实际使用缓存。自从draw()
可能很昂贵,做draw()
经常(例如,通过触发postOnAnimation()
)导致卡顿。
因此,我试图确定除此之外是否还有其他“绘图缓存”getDrawingCache()
,我们可以在启用硬件加速的情况下使用它,它可以用于设置此镜像,而且效率更高。据我所知,不存在这样的缓存,因为从 SDK 应用程序的角度来看,层实际上是只写的。但是,我希望也许我缺少一些解决方案。
提前致谢!