我不确定我是否在 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 == 0
或boundingBox.top - boundingBox.bottom == 0
),它是否是 Android 加速代码中的一个错误,它会过滤掉路径?也许!但我还有其他不渲染路径的情况:路径仅由直线组成。即使这些路径的边界框有体积,它们也不会渲染。将路径元素之一从直线更改为直线,整个路径渲染得很好。
当然,从性能的角度来看,我不想将某些线条渲染为直线,我假设线条绘制代码比三次曲线更快。因此,我发布此消息以询问其他人是否遇到过此问题以及是否有解决方法。
非常感谢一如既往。