2

我正在通过渲染路径来绘制地球仪。地球的边缘非常锋利,我想柔化边缘以使其更具视觉吸引力。

为了性能,我不做隐藏线移除。我只是在计算路径上的每个点是否可见(用户正在查看的地球的一侧)并将路径绘制到最近的角落。为了隐藏这一点,我在整个视图上绘制了一个位图,然后打一个洞来查看地球。

为了柔化边缘,我正在尝试创建一个具有径向渐变透明度的环。此方法创建掩码:

 private void createMask(int width, int height, double radius) {

        if(radius==0){return;}

        if (mask != null) {
            mask.recycle();
        }

        mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);

        // create a RadialGradient
        RadialGradient gradient = new android.graphics.RadialGradient(
                kHorizontalOffset, kVerticalOffset,
                30f, 0x00FF0000, 0xFFFF0000,
                android.graphics.Shader.TileMode.CLAMP);


        // TODO move to init()
        Paint p = new Paint();
        p.setShader(gradient);
        //p.setColor(0xFF000000);
        p.setColor(0xFFFF0000);
        p.setStrokeWidth(20f);
        p.setStrokeCap(Paint.Cap.ROUND);
        p.setStyle(Paint.Style.STROKE);
        p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));

        Canvas maskCanvas = new Canvas(mask);
        maskCanvas.drawColor(Color.BLACK);

        final RectF rect = new RectF();
        rect.set((float)(kHorizontalOffset - radius + 50), (float)(kVerticalOffset - radius + 50),
                (float)(kHorizontalOffset + radius - 50), (float)(kVerticalOffset + radius - 50));

        // draw transparent circle using the maskPaint
        maskCanvas.drawCircle(kHorizontalOffset, this.getHeight() - kVerticalOffset, (float) radius, maskPaint);

        // draw the radial gradient ring
        maskCanvas.drawArc(rect, -90, 360, false, p);

    }

我的问题是,无论我使用什么 PortDuff.Mode,我总是得到一个实心圆环(或没有圆环),如本例所示,圆环偏离边缘并涂成红色,这样我就可以看到发生了什么。

在此处输入图像描述

关于如何使这项工作的任何想法?

4

2 回答 2

1

我认为问题在于您如何设置颜色。

颜色分量是 (alpha,R,G,B),每一个都是从 0 到 255,所以当你写 0xFFFF0000 时。alpha 值设置透明度。因此,当您将 alpha 设置为 FF 时,这意味着它是完全不透明的,而 00 是完全透明的。所以尝试更改 alpha 值.. 可能类似于 0x70FF0000

于 2013-04-21T16:10:19.830 回答
1

我找到了一个更好的解决方案,最终得到了一个更小、更快的方法,它完全符合我的要求。有什么不喜欢的?

private void createMask(int width, int height, double radius) {

    if(radius==0){return;}

    if (mask != null) {
        mask.recycle();
    }

    mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);

    Canvas maskCanvas = new Canvas(mask);
    maskCanvas.drawColor(Color.BLACK);

    maskPaint.setMaskFilter(new BlurMaskFilter(30, BlurMaskFilter.Blur.INNER));
    maskCanvas.drawCircle(kHorizontalOffset, this.getHeight() - kVerticalOffset, (float) radius, maskPaint);

}

关键是应用到绘画的 BlurMaskFilter 以模糊它用于绘画的任何区域的内部,在本例中为圆形。它具有我正在寻找的微妙效果:

在此处输入图像描述

于 2013-04-21T19:34:40.837 回答