【问题标题】:How to preallocate RadialGradient?如何预先分配 RadialGradient?
【发布时间】:2024-05-11 19:30:02
【问题描述】:

我正在画布上画一些圆圈。我想对这个圆圈的每一个应用一个径向渐变。 我目前正在为每个圆圈分配一个新的渐变,但我猜这不是一个好主意。

protected void onDraw(Canvas canvas) 
{
    int radius = 6;
    int cx = radius;
    int cy = radius ;

    for(int i = 0; i < nbPage; i++)
    {
        if(i % 12 ==  0 && i > 0) {
            cx = radius;
            cy += 20;
        }

        RadialGradient gradient = new RadialGradient(cx, cy, radius, 0xFFFFFFFF,
                0xFF000000, android.graphics.Shader.TileMode.CLAMP);
        p.setDither(true);
        p.setShader(gradient);

        canvas.drawCircle(cx, cy, radius, p);
        cx += 20; //16px + 4 de marge

    }
}

在知道每个圆的半径相同但坐标不同的情况下,是否有预先分配径向梯度的解决方案?

谢谢

【问题讨论】:

    标签: android android-canvas gradient radial-gradients


    【解决方案1】:

    获取 RadialGradient 对象并将其绘制到位图,然后继续将该位图绘制到每个圆的画布上。

    Bitmap circleBitmap = Bitmap.create((int) (radius * 2.0f), (int) (radius * 2.0f),
        Bitmap.Config.ARGB_8888);
    Canvas tempCanvas = new Canvas(circleBitmap);
    
    RadialGradient gradient = new RadialGradient(cx, cy, radius, 0xFFFFFFFF,
                0xFF000000, android.graphics.Shader.TileMode.CLAMP);
    p.setDither(true);
    p.setShader(gradient);
    
    tempCanvas.drawCircle(radius, radius, radius, p);
    
    for (int i = 0; i < nbPage; i++)
        canvas.drawBitmap(circleBitmap, cx + (i * 20) - radius, cy - radius, p);
    

    【讨论】: