Android Canvas:仅绘制预先计算的Path的一部分

时间:2012-11-15 13:35:00

标签: android android-canvas

是否可以仅绘制路径的一部分?假设我的Path是从x = 0到x = 2000,整个Path在start时计算,Canvas放在Horizo​​ntalScrollView上。当滚动x = 500时,我想仅绘制该路径的500到1000;当x = 0时绘制0到1000,当x = 1500时,绘制1000到1500,当x = 2000绘制1000到2000时。

路径是一条贝塞尔曲线,因此如果需要一直进行计算,那么就会对性能造成损害。

感谢。

3 个答案:

答案 0 :(得分:1)

我可能会给你一个答案。

Picture类用于存储不会更改的图片,然后将它们写入画布。

例如,您可以拥有4个不同的Picture对象,每个对象都有Bezier曲线的一部分,然后在您需要时写入它们。

某些代码可能如下所示:

Picture b1 = new Picture();
Canvas c1 = b1.beginRecording(500, height);
// draw
b1.endRecording();
Picture b2 = new Picture();
Canvas c2 = b2.beginRecording(500, height);
c2.translate(-500, 0);
// draw
b2.endRecording();
Picture b3 = new Picture();
Canvas c3 = b3.beginRecording(500, height);
c3.translate(-1000, 0);
// draw
b3.endRecording();
Picture b4; = new Picture();
Canvas c4 = b4.beginRecording(500, height);
c4.translate(-1500, 0);
// draw
b4.endRecording();

(if x < 500) {
    // draw c1
}
...

可能有一种方法只画一次,而不是4次,但我只是张贴我所知道的作品。如果你能找到一种分区画布的方法,那么你只需要绘制一次。

答案 1 :(得分:1)

通过绘制整条线来获得解决方案,之后计算Rect以在其上绘制,以隐藏可见部分上的特定部分。

enter image description here

这是为了演示我是如何做到这一点的,我正在绘制整个Path,为了得到它的剪辑,我在它上面绘制一个矩形到屏幕的右边位置,所以它看起来像是剪辑路径。

答案 2 :(得分:1)

您可以为此使用getSegment方法,例如(Kotlin):

private fun getSubPath(path: Path, start: Float, end: Float): Path {
    val subPath = Path()
    val pathMeasure = PathMeasure(path, false)
    pathMeasure.getSegment(start * pathMeasure.length, end * pathMeasure.length, subPath, true)
    return subPath
}

用法:

val subPath = getSubPath(path = originalPath, start = 0.2f, end = 0.8f)