1

我正在循环增加clipPath 的大小。同样在循环内部是另一个循环,它创建了更多的clipPaths,我用它们来绘制较低的alpha,以便获得过渡效果。但是随着clipPath 大小的增加,过渡变得缓慢和滞后。

是这样的

int size = 5;
Paint p1 = new Paint();
Path path = new Path();
for (int i = 0; i < 20; i++) {
    path.addCircle(centerX, centerY, size, Path.Direction.CCW);
    canvas.clipPath(path);
    canvas.drawBitmap(bmp2, 0, 0, null);
    path.reset();
    int incr = size;
    while (p1.getAlpha() != 0) {
        incr -= 1;
        p1.setAlpha(p1.getAlpha() - 5);
        path.addCircle(centerX, centerY, incr, Path.Direction.CCW);
        canvas.clipPath(path, Op.UNION);
        canvas.drawBitmap(bmp2, 0, 0, p1);
        path.reset();
    }
    size += 10;
}

期望的结果

坡度

我知道这是一个不好的方法,但这是我能想到的。

4

1 回答 1

2

来自硬件加速的一些提示可能适用:

以下列表描述了硬件加速不支持的已知操作:

Canvas.clipPath()

[...]

不要在 draw 方法中创建渲染对象

一个常见的错误是每次调用渲染方法时都创建一个新的 Paint 或一个新的 Path。这迫使垃圾收集器更频繁地运行,并绕过硬件管道中的缓存和优化。

另外,我在某处读到/听说过,每当您修改路径时,都会生成一个掩码并将其重新上传到 GPU(?),因此您不应该经常修改它们。所以是的,该代码可能运行不快。

您可能对这些视频感兴趣:

编辑:我不知道实际的替代方法,但如果除了使用路径之外别无他法,您可以保留它们的数组,而无需修改它们。但是,如果动画有很多帧,那可能意味着很多内存。

于 2012-08-29T13:04:27.367 回答