Можно ли изменить цвет центра в радиальном градиенте андроида?

Легко достичь нижнего градиента слева, используя стандартные начальные, центральные и конечные цвета в радиальном градиенте с андроидом, в котором начальный = желтый, центральный = фиолетовый и конечный = синий. Однако круг справа требует изменения положения центрального цвета. Это возможно?

enter image description here

Результат слева можно воспроизвести с чем-то вроде:

    <shape android:shape="oval">
        <gradient
            android:endColor="#0000ff"
            android:gradientRadius="my_radius"
            android:centerColor="#770077"
            android:startColor="#00ffff"
            android:type="radial"/>
    </shape>

Мне интересно, могу ли я изменить цвет центра, чтобы достичь градиента справа. Я считаю, что ответ отрицательный, но я хотел бы узнать, открыл ли кто-нибудь способ сделать это. Спасибо!

Ответ 1

К сожалению, этого не может быть достигнуто посредством XML-объявлений, однако это можно сделать с помощью кода.

Вот пример быстрого кода:

public class MyDrawing extends View 
{   
    private Paint mPaint;

    public MyDrawing(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    public MyDrawing(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
    }

    public MyDrawing(Context context)
    {
        super(context);
        init();
    }

    private void init()
    {
        int [] colors = new int[] { 0xff0000ff, 0xff00ff00, 0xffff0000 };
        float [] positions = new float[] { 0.4f, 0.7f, 0.9f };

        RadialGradient gradient = new RadialGradient(50, 50, 50, colors, positions, TileMode.CLAMP);                
        mPaint = new Paint();
        mPaint.setDither(true);
        mPaint.setShader(gradient);
    }

    @Override
    protected void onDraw(Canvas canvas) 
    {           
        super.onDraw(canvas);                               

        canvas.drawCircle(circleX, circleY, circleRadius, mPaint);      
    }
}

Две вещи, на которые вы должны обратить внимание:

  • В массиве цветов вы должны указать альфа (1-й на символы). В моем примере я указал как "ff", что означает отсутствие прозрачности. Если вы не укажете альфу, по умолчанию будет 0.

  • Аргумент позиций определяет положение или силу каждого цвета в градиенте. Играйте с этим, чтобы достичь результата, который вы ищете.

Надеюсь, что это поможет:)