2

我想在我的 android 应用程序中绘制一个圆形叠加层,我当然可以轻松地完成它并为其添加颜色。

但我真正想做的是保持圆圈透明,并用浅灰色遮蔽圆圈的外部(世界其他地方)。

我尝试将圆圈添加为路径,遮蔽世界并将圆圈剪掉,但我的设备上的圆圈周围有一个边界框(尽管它在模拟器上看起来不错)。

任何帮助表示赞赏。下面是一个代码片段:

public void draw(Canvas canvas, MapView mapView, boolean shadow) { super.draw(canvas, mapView, shadow);

    Projection projection = mapView.getProjection();

    Point pt = new Point();

    GeoPoint geo = new GeoPoint((int) (mLat * 1e6), (int) (mLon * 1e6));

    projection.toPixels(geo, pt);
    float circleRadius = projection.metersToEquatorPixels(mRadius)
            * (1 / FloatMath.cos((float) Math.toRadians(mLat)));

    Paint innerCirclePaint;

    innerCirclePaint = new Paint();
    innerCirclePaint.setColor(Color.TRANSPARENT);
    innerCirclePaint.setAlpha(35);
    innerCirclePaint.setAntiAlias(true);
    innerCirclePaint.setStyle(Paint.Style.FILL);

    Path path = new Path();
    path.setFillType(Path.FillType.WINDING);
    path.addCircle((float) pt.x, (float) pt.y, circleRadius, Path.Direction.CCW);canvas.drawPath(path, innerCirclePaint);
    canvas.drawARGB(150, 0, 0, 0 );
    canvas.clipPath(path);
}
4

2 回答 2

1
paint.setColor(Color.parseColor ("#88ff0000"));
于 2012-12-13T05:07:27.947 回答
0

尝试

path.setFillType(Path.FillType.INVERSE_WINDING);

代替

path.setFillType(Path.FillType.WINDING); 

我尝试了普通图像,这个补丁对我有用

    Canvas canvas = new Canvas(bitmap);
    Paint innerCirclePaint;

    innerCirclePaint = new Paint();
    innerCirclePaint.setColor(Color.parseColor ("#88ff0000"));
    innerCirclePaint.setAlpha(35);
    innerCirclePaint.setAntiAlias(true);
    innerCirclePaint.setStyle(Paint.Style.FILL);

    Path path = new Path();
    path.setFillType(Path.FillType.INVERSE_WINDING);
    path.addCircle(150, 150, 150, Path.Direction.CCW);

    canvas.drawPath(path, innerCirclePaint);
    canvas.drawARGB(0, 0, 0, 0 );
    canvas.clipPath(path);

甚至 clipPath 也可能是一个原因

解决 android 不再支持的 Canvas.clipPath()

于 2013-05-28T17:33:33.110 回答