我有一個mapview,我想繪製一個圓形以專注於給定的區域。但是我想要這個圓被倒置。也就是說,而不是填充圓的內部,它是透明的,其他一切都被填充。請參閱此圖片以瞭解我的意思(http://i.imgur.com/zxIMZ.png)。上半部分顯示了我可以用正常的圓圈做什麼。底部顯示「倒置」的圓圈。繪製透明圓形外部填充
我試過搜索,但很難找到我想要的東西。有誰知道我可以如何去做這樣的事情?
我有一個mapview,我想繪製一個圓形以專注於給定的區域。但是我想要這個圓被倒置。也就是說,而不是填充圓的內部,它是透明的,其他一切都被填充。請參閱此圖片以瞭解我的意思(http://i.imgur.com/zxIMZ.png)。上半部分顯示了我可以用正常的圓圈做什麼。底部顯示「倒置」的圓圈。繪製透明圓形外部填充
我試過搜索,但很難找到我想要的東西。有誰知道我可以如何去做這樣的事情?
您可以創建一個新的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();
+1。我想不出一個更好的解決方案 – GETah 2011-12-18 11:16:59
據我所知,awt庫在android中不可用,我找不到任何相當的東西可以做到這一點。 – user1104351 2011-12-18 14:49:57
@ user1104351:哦,那很傷心。 BufferedImage是一個非常有用的強大類。這很傷心。我不熟悉Android。但我試圖幫助... – 2011-12-18 15:17:23
我的回答很晚,但可能有助於某人達到此目的。 這裏是一個例子,如何使半透明的視圖與最小尺寸的透明圓匹配大小,放置在中間的小邊距。它可以作爲覆蓋放置在任何視圖上。
/*
* 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
}
}
在這裏,它的外觀在我的情況:
這對我很有幫助,但我遇到了一個問題。使用上面的代碼,將圓形內部渲染爲黑洞。 [這篇文章](http://stackoverflow.com/questions/11337679/porterduffxfermode-clear-a-section-of-a-bitmap)建議將以下內容添加到我的構造函數代碼中進行修復: setLayerType(View。 LAYER_TYPE_SOFTWARE,null); – sidecarcat 2016-02-12 15:56:35
做,你會做畫一個圓圈正常,但與補體的位置和補充半徑。
像{0緯度,(180龍)180%,20037508.34半徑}
你想掩蓋了地圖的「休息」,並留下了地圖的只有一個圓形鎖孔視圖這是所有人唯一正確和完美的答案。需要被接受的! 但它需要是(0 - lat,lng - 180) – kaiser 2018-01-18 00:32:36
? – 2017-08-22 07:11:17