不渲染转换后的路径

Dob*_*bbo 2 android drawing

我不确定我是否在 Android 中发现了错误,或者我的代码中是否存在错误。我认为这可能是我读过的硬件加速错误的另一种(或新的)表现形式。我在 android 4.2 上运行,但android:hardwareAccelerated="true"在清单文件中设置并不能解决问题。

问题存在于自定义视图中。它有一个复杂的显示,所以Path我不是单独指定所有字段,而是解析一个 SVG 文件并根据<path>元素的数据规范构建路径。SGV 解析器还提取了 SVG 绘图区的宽度和高度,以便View生成在 SVG 空间和空间之间转换的矩阵:

Matrix t = new Matrix();

float scale = Math.min(viewWidth / svgWidth, viewHeight / svgHeight);
t.setScale(scale, scale);
Run Code Online (Sandbox Code Playgroud)

此变换应用于onDraw(Canvas)方法中的画布。问题是有些路径渲染正常,有些则没有。沿着路径渲染的文本也是如此。

我想我已经找到了渲染和未渲染之间的区别:直线。被渲染的文本在一条对角线上,而不是在一条完全水平的线上。将文本路径从水平方向移开会导致文本被渲染。将水平线更改为三次曲线也是如此,控制点位于线本身上 - 因此它呈现为一条直线;从现在开始我将称之为直线曲线。

如果边界框(翻译前或翻译后)的体积为零(boundingBox.left - boundingBox.right == 0boundingBox.top - boundingBox.bottom == 0),Android 加速代码中是否存在过滤路径的错误?也许!但是我还有其他不渲染路径的情况:路径仅由直线组成。即使这些路径的边界框有体积,它们也不会渲染。将路径元素之一从直线更改为直线,整个路径渲染得很好。

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

一如既往地非常感谢。

Mat*_*son 5

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

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

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