画出外面填充的透明圆圈

我有一个mapview,我想绘制一个圆圈,专注于给定的区域。 但我希望圆圈被倒置。 也就是说,它不是被填充的圆圈内部,而是透明的,其他一切都被填满。 看到这张图片的意思(http://sofzh.miximages.com/java/zxIMZ.png)。 上半部分显示了我可以用正常的圆圈做什么。 底部显示“倒”圆。

我试图搜索,但很难找到我想要的东西。 有谁知道我怎么能做这样的事情?

我的答案很晚,但可能有助于实现这一目标。 下面是一个如何制作半透明视图的示例,其中透明圆圈匹配最小尺寸的尺寸,放置在中心,边距较小。 它可以作为叠加放置在任何视图上。

/* * 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 } } 

在这里我的情况看起来如何:

透明圆圈覆盖视图。

您可以创建一个新的BufferedImage,将其填充为灰色,然后删除所需的圆圈。

然后,在视图上绘制BufferedImage。

 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(); 

像绘制正常圆但具有补充位置和补充半径一样。

像{0-Lat,(180-Long)%180,200707508.34-Radius}