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

问题描述 投票:1回答:3

是否可以仅绘制路径的一部分?假设我的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。

路径是一条贝塞尔曲线,因此如果计算需要一直进行,则会对性能造成破坏。

谢谢。

android android-canvas
3个回答
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
投票

通过绘制整条线得到解决方案,然后计算矩形以在其上绘制,以隐藏可见部分上的特定部分。

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


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)
© www.soinside.com 2019 - 2024. All rights reserved.