Создать представление с прозрачным кругом

Я хочу создать представление с закругленными углами и круглой кнопкой по центру. На данный момент я использую форму прямоугольника с круглыми границами в качестве фона (зеленая часть) и форму белого круга, которая содержит кнопку (зеленая кнопка с логотипом Android).

Это прекрасно работает, если фон (на данный момент желтый/коричневый, просто для лучшей визуализации) имеет тот же цвет, что и форма круга.

Но теперь я хочу использовать градиентный фон: Как можно добиться такого же эффекта с помощью прозрачного круга?

Я не смог создать такой же вид с обычными фигурами андроида (у меня была идея закругленных углов).

Создать представление с прозрачным кругом

0
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решил это с помощью пользовательского представления. Он нарисует прямоугольник, заполненный заданным цветом. После этого овал будет очищен.

Выложу минимизированный код (без пользовательских атрибутов и т.п.), может кому-то когда-нибудь пригодится:

public class InvertedCircleView extends View {

    private Paint mPaint;
    private float mCanvasCenterX;

    private float mCenterCircleWidth, mCenterCircleHeight;


    public InvertedCircleView(Context context, AttributeSet attrs) {
        super(context, attrs);

        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

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

        mPaint.setColor(getResources().getColor(android.R.color.holo_green_dark));
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawPaint(mPaint);

        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        mCenterCircleWidth = canvas.getWidth();        
        mCenterCircleHeight = canvas.getHeight();        

        mCanvasCenterX = canvas.getWidth() / 2;

        canvas.drawOval(mCanvasCenterX - (mCenterCircleWidth / 2),
                -mCenterCircleHeight,
                mCanvasCenterX + (mCenterCircleWidth / 2),
                mCenterCircleHeight,
                mPaint);
    }
}

Другие вопросы по теме