【发布时间】:2013-01-18 07:27:46
【问题描述】:
我不确定我是否在 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 加速代码中的错误会过滤掉路径?可能是!但我还有其他不渲染路径的情况:路径仅由直线组成。即使这些路径的边界框有体积,它们也不会渲染。将其中一个路径元素从一条直线更改为一条直线,整个路径渲染得很好。
当然,从性能的角度来看,我不想将某些线条渲染为直线,我假设线条绘制代码比三次曲线更快。所以我发这个来问问有没有人遇到过这个问题,是否有解决办法。
非常感谢一如既往。
【问题讨论】:
-
您好,我也有类似的问题。请看我的问题:stackoverflow.com/questions/16656453/…。这与您的问题相似吗?直到现在都没有解决方案……打开 HardwareAcceleration 并不能解决问题……
-
@Opiatefuchs 很可能是同样的问题。在路径接缝上调用 translate(...) 是问题所在。
-
感谢您的回复...所以您到现在还没有解决方案?
-
不,我在它周围编码以避免这种情况。我不确定这是系统错误还是我做错了什么。鉴于缺乏回应,我懒得再进一步了。