我不确定我是否在Android中发现了错误,或者我的代码中是否存在错误。我认为这可能是我读过的硬件acceleration bug的另一个(或新的)表现形式。我在android 4.2上运行,但在清单文件中设置android:hardwareAccelerated="true"
并不能解决问题。
自定义视图中存在问题。它具有复杂的显示,因此我不是单独指定所有Path
字段,而是解析SVG文件并根据<path>
元素的数据规范构建路径。 SGV解析器还提取SVG绘图区域的宽度和高度,以便生成在SVG空间和View
空间之间转换的矩阵:
Matrix t = new Matrix();
float scale = Math.min(viewWidth / svgWidth, viewHeight / svgHeight);
t.setScale(scale, scale);
此变换应用于onDraw(Canvas)
方法中的画布。问题是有些路径可以正常运行而有些则没有。沿着路径呈现的文本也是如此。
我认为我已经找到了渲染和未渲染之间的区别:直线。正在渲染的文本是在对角线上,文本不是完全水平的。将文本路径水平移动会导致文本被渲染。将水平线更改为具有线本身上的控制点的三次曲线也是如此 - 因此它呈现为直线;从现在开始我称之为直线曲线。
如果边界框(翻译前或翻译后)的音量为零(boundingBox.left - boundingBox.right == 0
或boundingBox.top - boundingBox.bottom == 0
),Android加速代码中是否会过滤掉路径?也许!但我还有其他不渲染路径的情况:路径只是直线组成。即使这些路径的边界框具有体积,它们也不会渲染。将其中一个路径元素从直线更改为直线曲线,整个路径渲染得很好。
当然,从性能视图来看,我不想将我的一些线条渲染为直线曲线,我假设线条绘制代码比三次曲线快。所以我发布这个问题来询问是否有其他人遇到过这个问题以及是否有解决方法。
非常感谢。
答案 0 :(得分:4)
我刚刚发现我必须关闭()一个路径让它在一些设备/模拟器上渲染 - 即使它只是现有的,封闭的路径的转换版本,事实上,即使它是只是直接从现有路径创建的新路径。
例如,Path thisIsInvisible = new Path(existingClosedPath);
- existingClosedPath
会在我的画布上画得很好。 thisIsInvisible
会默默地出现。但是如果我在创建它之后调用thisIsInvisible.close()
,它就可以正常工作。
我还发现interesting post from Romain Guy建议在启用硬件加速时,使用addPath()执行与transform()相同的工作可能会更好。
答案 1 :(得分:1)
我在android 4.1.2版本上遇到类似的路径转换问题。有些路径根本不会变换或绘制。 通过关闭硬件加速解决了这个问题。希望这将有助于将来。