Android画布:仅绘制部分预先计算的路径

Android画布:仅绘制部分预先计算的路径,android,android-canvas,Android,Android Canvas,是否可以只绘制路径的一部分?假设我的路径是从x=0到x=2000,整个路径在开始时计算,画布放置在HorizontalScrollView上。当滚动x=500时,我只想从该路径的500到1000绘制;当x=0时,绘制0到1000;当x=1500时,绘制1000到1500;当x=2000时,绘制1000到2000 路径是一条贝塞尔曲线,因此如果需要一直进行计算,则会破坏性能 谢谢。我可以给你一个答案 Picture类用于存储不变的图片,然后将其写入画布 例如,您可以有4个不同的图片对象,每个对象都

是否可以只绘制路径的一部分?假设我的路径是从x=0到x=2000,整个路径在开始时计算,画布放置在HorizontalScrollView上。当滚动x=500时,我只想从该路径的500到1000绘制;当x=0时,绘制0到1000;当x=1500时,绘制1000到1500;当x=2000时,绘制1000到2000

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


谢谢。

我可以给你一个答案

Picture类用于存储不变的图片,然后将其写入画布

例如,您可以有4个不同的图片对象,每个对象都有一部分贝塞尔曲线,然后在需要时写入它们

某些代码可能如下所示:

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
}
...
Picture b1=新图片();
画布c1=b1。开始记录(500,高度);
//画
b1.结束记录();
图片b2=新图片();
画布c2=b2。开始记录(500,高度);
c2.翻译(-500,0);
//画
b2.endRecording();
图片b3=新图片();
画布c3=b3。开始记录(500,高度);
c3.翻译(-1000,0);
//画
b3.结束记录();
图片b4;=新图片();
帆布c4=b4。开始记录(500,高度);
c4.翻译(-1500,0);
//画
b4.结束记录();
(如果x<500){
//图c1
}
...

也许有一种方法可以只画一次,而不是四次,但我只是把我知道有用的东西贴出来。如果你能找到一种划分画布的方法,那么你只需要画一次。

我可能会给你一个答案

Picture类用于存储不变的图片,然后将其写入画布

例如,您可以有4个不同的图片对象,每个对象都有一部分贝塞尔曲线,然后在需要时写入它们

某些代码可能如下所示:

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
}
...
Picture b1=新图片();
画布c1=b1。开始记录(500,高度);
//画
b1.结束记录();
图片b2=新图片();
画布c2=b2。开始记录(500,高度);
c2.翻译(-500,0);
//画
b2.endRecording();
图片b3=新图片();
画布c3=b3。开始记录(500,高度);
c3.翻译(-1000,0);
//画
b3.结束记录();
图片b4;=新图片();
帆布c4=b4。开始记录(500,高度);
c4.翻译(-1500,0);
//画
b4.结束记录();
(如果x<500){
//图c1
}
...

也许有一种方法可以只画一次,而不是四次,但我只是把我知道有用的东西贴出来。如果你能找到一种划分画布的方法,那么你只需要画一次就可以了。

通过画整条线得到了解决方案,然后计算Rect在画布上绘制,在可见部分上隐藏特定部分


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

通过画整条线得到了解决方案,然后计算Rect在它上面绘制,在可见部分隐藏特定部分


这是为了演示我是如何做到这一点的,我正在绘制整个路径,为了得到它的剪辑,我在它的顶部绘制了一个矩形到屏幕的正确位置,因此它看起来像是在剪辑路径。

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

用法:

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

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

用法:

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

这意味着如果我的X比例是2000,我需要2000张图片,因此不适合我在这里的用途。这意味着如果我的X比例是2000,我需要2000张图片,因此不适合我在这里的用途。为此,您可能使用canvas.drawBitmap(位图、src、dst、paint),对吗?您在何处插入了路径对象?我也面临着类似的问题。。您可以发布一些代码部分吗?对于这一部分,您可能使用了canvas.drawBitmap(位图、src、dst、paint),对吗?您在何处插入了路径对象?我也面临着类似的问题。。你能把那部分代码贴出来吗?