2

我不确定我是否在 Android 中发现了错误,或者我的代码中是否存在错误。我认为这可能是我读到的硬件加速错误的另一种(或新的)表现形式。我在 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 == 0boundingBox.top - boundingBox.bottom == 0),它是否是 Android 加速代码中的一个错误,它会过滤掉路径?也许!但我还有其他不渲染路径的情况:路径仅由直线组成。即使这些路径的边界框有体积,它们也不会渲染。将路径元素之一从直线更改为直线,整个路径渲染得很好。

当然,从性能的角度来看,我不想将某些线条渲染为直线,我假设线条绘制代码比三次曲线更快。因此,我发布此消息以询问其他人是否遇到过此问题以及是否有解决方法。

非常感谢一如既往。

4

2 回答 2

5

我刚刚发现我必须 close() 一个 Path 才能让它在某些设备/模拟器上呈现——即使它只是现有的、封闭的 Path 的转换版本,事实上,即使它只是一个新的直接从现有路径创建的路径。

例如,Path thisIsInvisible = new Path(existingClosedPath);——existingClosedPath在我的画布上画得很好。thisIsInvisible不会默默出现。但是,如果我在创建它之后调用thisIsInvisible.close()它,它就可以正常工作。

我还发现了来自 Romain Guy 的一篇有趣的帖子,建议在启用硬件加速的情况下,使用 addPath() 来完成与 transform() 相同的工作可能会更好。

于 2014-06-29T22:12:32.477 回答
1

我在 android 4.1.2 版本上遇到了类似的路径转换问题。有些路径根本不会变换或绘制。通过关闭硬件加速来解决它。希望这对将来的人有所帮助。

于 2013-05-15T15:18:24.110 回答