Java 绘制外部填充的透明圆
我有一个地图视图,我想在它上面画一个圆圈来聚焦于一个给定的区域。但我想把这个圆倒过来。也就是说,圆的内部不是被填充的,而是透明的,其他的都被填充了。看看这张图片,了解我的意思(http://i.imgur.com/zxIMZ.png). 上半部分显示了我可以用普通圆做什么。底部显示“倒”圆Java 绘制外部填充的透明圆,java,android,android-mapview,Java,Android,Android Mapview,我有一个地图视图,我想在它上面画一个圆圈来聚焦于一个给定的区域。但我想把这个圆倒过来。也就是说,圆的内部不是被填充的,而是透明的,其他的都被填充了。看看这张图片,了解我的意思(http://i.imgur.com/zxIMZ.png). 上半部分显示了我可以用普通圆做什么。底部显示“倒”圆 我试过搜索,但很难找到我想要的。有人知道我怎么做这样的事情吗?你可以创建一个新的BuffereImage,将其填充为灰色,然后删除你想要的圆圈 然后,在视图顶部绘制BuffereImage BufferedI
我试过搜索,但很难找到我想要的。有人知道我怎么做这样的事情吗?你可以创建一个新的BuffereImage,将其填充为灰色,然后删除你想要的圆圈 然后,在视图顶部绘制BuffereImage
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();
我的答案很晚了,但可能会帮助某人实现这一点。 下面是一个示例,说明如何使半透明视图的透明圆与最小尺寸的大小相匹配,放置在中间并留有小的边距。它可以作为覆盖放置在任何视图上
/*
* 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
}
}
下面是我的情况:
按照绘制法向圆的方法进行操作,但要使用补码位置和补码半径。比如:
{0-Lat, (Long-180)%180, 20037508.34-Radius}
据我所知,awt库在android中是不可用的,我也找不到任何能做到这一点的等效工具。@user1104351:哦,真是太遗憾了。BuffereImage是一个非常有用、功能强大的类。那太可悲了。我不熟悉安卓系统。但是我试着帮助…这对我很有帮助,但我遇到了一个问题。使用上述代码,圆的内部被渲染为黑洞。建议在我的构造函数代码中添加以下内容来修复它:setLayerType(View.LAYER\u TYPE\u SOFTWARE,null);你想掩盖地图的“其余部分”,只留下地图的圆形锁孔视图吗?这是唯一正确和完美的答案。需要被接受的一个!但它必须是(0-lat,lng-180)