Я хочу создать представление с закругленными углами и круглой кнопкой по центру. На данный момент я использую форму прямоугольника с круглыми границами в качестве фона (зеленая часть) и форму белого круга, которая содержит кнопку (зеленая кнопка с логотипом Android).
Это прекрасно работает, если фон (на данный момент желтый/коричневый, просто для лучшей визуализации) имеет тот же цвет, что и форма круга.
Но теперь я хочу использовать градиентный фон: Как можно добиться такого же эффекта с помощью прозрачного круга?
Я не смог создать такой же вид с обычными фигурами андроида (у меня была идея закругленных углов).
Решил это с помощью пользовательского представления. Он нарисует прямоугольник, заполненный заданным цветом. После этого овал будет очищен.
Выложу минимизированный код (без пользовательских атрибутов и т.п.), может кому-то когда-нибудь пригодится:
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);
}
}