2012-08-29 63 views
1

我正在增加循环中clipPath的大小。在循环内部还有另一个循环,它创建了几个clipPath,我使用这些循环来绘制降低的alpha值,以便获得转换效果。但随着clipPath的大小增加,转换变得缓慢而滞后。增加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; 
} 

所需的结果

Gradient

我知道这是个不错的办法,但是这是我能想到的。

回答

2

Hardware Acceleration一些提示,可能是适用的:

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

Canvas.clipPath()

[...]

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

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

另外,我读/某处听说任何时候你修改的路径,生成一个面具,重新上传到GPU(?),所以你不应该保持经常修改它们。所以是的,该代码可能运行速度不快。

你可能有兴趣在这些视频:

编辑:我不知道实际的选择,但如果有比不使用其他方法路径,你可以保留它们的一个数组,而不用修改它们。但是,如果动画有很多帧,那可能意味着很多内存。

+0

那么,你能否给我一个关于如何实现避免路径变化的效果的想法。 我在帖子中添加了一张图片。 –

+0

@TimeManx请参阅编辑 – bigstones