【问题标题】:Not rendering a transformed path不渲染转换后的路径
【发布时间】: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 == 0boundingBox.top - boundingBox.bottom == 0),是否是 Android 加速代码中的错误会过滤掉路径?可能是!但我还有其他不渲染路径的情况:路径仅由直线组成。即使这些路径的边界框有体积,它们也不会渲染。将其中一个路径元素从一条直线更改为一条直线,整个路径渲染得很好。

当然,从性能的角度来看,我不想将某些线条渲染为直线,我假设线条绘制代码比三次曲线更快。所以我发这个来问问有没有人遇到过这个问题,是否有解决办法。

非常感谢一如既往。

【问题讨论】:

  • 您好,我也有类似的问题。请看我的问题:stackoverflow.com/questions/16656453/…。这与您的问题相似吗?直到现在都没有解决方案……打开 HardwareAcceleration 并不能解决问题……
  • @Opiatefuchs 很可能是同样的问题。在路径接缝上调用 translate(...) 是问题所在。
  • 感谢您的回复...所以您到现在还没有解决方案?
  • 不,我在它周围编码以避免这种情况。我不确定这是系统错误还是我做错了什么。鉴于缺乏回应,我懒得再进一步了。

标签: android drawing


【解决方案1】:

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

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

我还发现了一个interesting post from Romain Guy,建议在启用硬件加速的情况下,使用 addPath() 完成与 transform() 相同的工作可能会更好。

【讨论】:

  • 谢谢!这解决了我的问题。
  • 谷歌,这简直是智障。而不是 Path.transform(Matrix, null),需要使用 new Path().addPath(path, Matrix) 并解决了吗?为什么该死的 Path.transform() 函数一开始就不起作用?所以现在我必须在所有模拟器上测试我的应用程序,因为像这样的愚蠢错误?搞砸安卓。
【解决方案2】:

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

【讨论】:

  • 查看我上面链接的问题。通过打开硬件加速,绘制的文本在运行时看起来会变形并调用 getDrawingCatche()。开启后,它只在保存图片时调用 getDrawingCatche() 后看起来会变形,而在运行时则不会。
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多