Eag*_*gle 8 android android-emulator android-canvas android-view
我正在开发一个Android应用程序的自定义视图,类似于Mind the Robot提供的Analog Gauge示例代码.
从列出的网站运行代码,我在屏幕上看到这个:
(摩托罗拉Droid,2.2.3),(仿真器,4.0.3)

(Xoom,4.0.3)(其他电话,4.0.3)

手不见了!
正在进行绘图调用(我可以在logcat中看到它们),但调用绘制的画布元素是不可见的.
但是,它不依赖于API级别 ; 如果我以正确的方式将其导入到项目中,当我在Xoom上运行时,它将显示出来.
但是,当我将文件移动到不同的项目文件夹(相同的源代码,相同的布局)时,它会回到丢失拨号盘.
这是怎么回事?相同的代码如何在不同的设备上产生如此不同的结果?
Eag*_*gle 13
因此,我神秘的关键线索似乎是它在模拟器上工作,但在硬件设备上却没有.
我确实仔细阅读了Android Developer网站上的硬件渲染页面,但显然还不够.
http://developer.android.com/guide/topics/graphics/hardware-accel.html
虽然它确实提到API从版本11开始可用,但它没有说默认情况下为所有应用程序启用硬件渲染,从API级别14(ICS)开始.
这对我们意味着什么?
几乎一切都更快; 除了少数不起作用的东西.
我设法违反其中两个,没有意识到:
它没有在API参考中提及(或者我能找到的任何其他地方,当然也没有被Lint检查过),但使用任何列出的操作都可以做到奇怪的事情.
就我而言,Canvas.DrawTextOnPath()似乎工作正常.
但是当Android注意到我手上使用的颜色设置了阴影层时,它会默默地忽略它.
从上面的文档链接:
检查应用程序是否为硬件加速有两种不同的方法:
- 如果视图附加到硬件加速窗口,View.isHardwareAccelerated()将返回true.
- 如果Canvas是硬件加速的,Canvas.isHardwareAccelerated()将返回true
如果必须检查绘图代码,请尽可能使用Canvas.isHardwareAccelerated()代替View.isHardwareAccelerated().当视图附加到硬件>加速窗口时,仍然可以使用非硬件加速的Canvas绘制它.例如,当将视图绘制到位图中以进行缓存时,会发生这种情况.
就我而言,似乎已经发生了相反的情况.自定义视图记录它不是硬件加速的; 然而,画布报告它是硬件加速的.
最简单的解决方法是强制自定义视图进行软件渲染.根据文档,这可以通过以下方式完成:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Run Code Online (Sandbox Code Playgroud)
或者,您可以删除有问题的操作,并保持硬件渲染打开.
从我的不幸中学习.祝你好运.
| 归档时间: |
|
| 查看次数: |
4728 次 |
| 最近记录: |