Создать вид с прозрачным кругом - PullRequest
0 голосов
/ 18 февраля 2019

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

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

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

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

enter image description here

1 Ответ

0 голосов
/ 18 февраля 2019

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

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

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);
    }
}
...