所以,我的谜团中的关键线索似乎是它在模拟器上工作,而不是在硬件设备上。
硬件渲染
我确实仔细阅读了 Android 开发者网站上的硬件渲染页面,但显然不够仔细。
http://developer.android.com/guide/topics/graphics/hardware-accel.html
虽然它确实提到 API 从版本 11 开始可用,但它并没有说默认情况下所有应用程序都启用硬件渲染,从 API 级别 14 (ICS) 开始。
这对我们意味着什么?
几乎一切都更快;除了一些不起作用的东西。
我设法违反了其中两个,但没有意识到:
- Canvas.DrawTextOnPath()
- Paint.setShadowLayer()
API 参考中没有提到它(或者我能找到的任何其他地方,当然也没有被 Lint 检查),但是使用任何列出的操作都可以做一些奇怪的事情。
就我而言, Canvas.DrawTextOnPath() 似乎工作得很好。
但是当Android注意到我在手上使用的油漆设置了阴影层时,它会默默地忽略它。
我如何知道我的 View 是否是硬件加速的?
从上面的文档链接:
有两种不同的方法可以检查应用程序是否是硬件加速的:
- 如果视图附加到硬件加速窗口,View.isHardwareAccelerated()返回 true。
- 如果 Canvas 是硬件加速的,Canvas.isHardwareAccelerated()返回 true
如果您必须在绘图代码中执行此检查,请尽可能使用 Canvas.isHardwareAccelerated() 而不是 View.isHardwareAccelerated()。当视图附加到硬件 > 加速窗口时,仍然可以使用非硬件加速的 Canvas 进行绘制。例如,当出于缓存目的将视图绘制到位图中时,就会发生这种情况。
在我的情况下,似乎发生了相反的情况。自定义视图记录它不是硬件加速的;但是,画布报告它是硬件加速的。
解决方法和固定装置
最简单的解决方法是强制自定义视图进行软件渲染。根据文档,这可以通过以下方式完成:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或者,您可以删除有问题的操作,并保持打开硬件渲染。
从我的不幸中吸取教训。祝你好运。