Dibujar un círculo transparente lleno afuera

Tengo una vista de mapa en la que quiero dibujar un círculo para enfocarme en un área determinada. Pero quiero que el círculo se invierta. Es decir, en lugar de que se llene el interior del círculo, es transparente y todo lo demás se llena. Vea esta imagen por lo que quiero decir (http://sofes.miximages.com/java/zxIMZ.png). La mitad superior muestra lo que podría hacer con un círculo normal. La parte inferior muestra el círculo “invertido”.

Intenté buscar, pero ha sido difícil encontrar lo que quiero. ¿Alguien sabe cómo podría hacer algo como esto?

Mi respuesta es bastante tarde, pero puede ayudar a alguien a lograr esto. Aquí hay un ejemplo de cómo hacer una vista semitransparente con un círculo transparente que coincida con el tamaño de la dimensión más pequeña, colocado en el centro con un pequeño margen. Se puede colocar como superposición en cualquier vista.

/* * Copyright (c) 2015 Singularex Inc. */ package your_package.ui.widget; import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.os.Build; import android.util.AttributeSet; import android.widget.LinearLayout; import android.widget.RelativeLayout; import your_package.R; /** * @author Victor Kosenko */ public class RadiusOverlayView extends LinearLayout { private Bitmap windowFrame; public RadiusOverlayView(Context context) { super(context); } public RadiusOverlayView(Context context, AttributeSet attrs) { super(context, attrs); } public RadiusOverlayView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public RadiusOverlayView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (windowFrame == null) { createWindowFrame(); // Lazy creation of the window frame, this is needed as we don't know the width & height of the screen until draw time } canvas.drawBitmap(windowFrame, 0, 0, null); } protected void createWindowFrame() { windowFrame = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); // Create a new image we will draw over the map Canvas osCanvas = new Canvas(windowFrame); // Create a canvas to draw onto the new image RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight()); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // Anti alias allows for smooth corners paint.setColor(getResources().getColor(R.color.map_radius_outer)); // This is the color of your activity background paint.setAlpha(84); osCanvas.drawRect(outerRectangle, paint); paint.setColor(Color.TRANSPARENT); // An obvious color to help debugging paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)); // A out B http://en.wikipedia.org/wiki/File:Alpha_compositing.svg float centerX = getWidth() / 2; float centerY = getHeight() / 2; float radius = Math.min(getWidth(), getHeight()) / 2 - getResources().getDimensionPixelSize(R.dimen.view_margin_small2); osCanvas.drawCircle(centerX, centerY, radius, paint); } @Override public boolean isInEditMode() { return true; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); windowFrame = null; // If the layout changes null our frame so it can be recreated with the new width and height } } 

Y aquí cómo se ve en mi caso:

Vista de superposición de círculo transparente.

Puedes crear una nueva Imagen Buffered, llenarla de gris y borrar el círculo donde quieras.

Y luego, dibuja esa Imagen Buffered en la parte superior de tu vista.

 BufferedImage img = new BufferedImage(sizeX, sizeY, BufferedImage.TYPE_INT_RGBA); Graphics2D g = img.createGraphics(); int ovalX = 50; int ovalY = 70; int ovalRadius = 20; /* Draw the grey rectangle */ g.setColor(Color.GRAY); g.fillRect(0, 0, sizeX, sizeY); /* Enable Anti-Alias */ g.setRenderingHint(RenderingHints.HINT_ANTIALIAS, RenderingHints.VALUE_ANTIALIAS_ON); /* Clear the circle away */ g.setComposite(AlphaComposite.CLEAR, 1.0f); g.fillOval(ovalX - ovalRadius, ovalY - ovalRadius, 2 * ovalRadius, 2 * ovalRadius); g.dispose(); 

Haz lo que harías para dibujar un círculo normal pero con la ubicación del complemento y el radio del complemento.

Me gusta {0-Lat, (180-Long)% 180, 20037508.34-Radius}