创建具有径向渐变透明度的环

时间:2013-04-21 16:00:45

标签: android

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

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

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

 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,我总是得到一个坚固的戒指(或没有戒指),就像在这个例子中,戒指从边缘偏移并涂成红色,这样我就可以看到发生了什么上。

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

颜色成分是(α,R,G,B),每一个都是0到255 所以当你写0xFFFF0000时。 alpha值设置透明度。 所以当你将alpha设置为FF时,这意味着它是完全不透明的,而00是完全透明的。 所以尝试更改alpha值..也许像0x70FF0000

答案 1 :(得分: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应用于绘画以模糊其用于绘制的任何区域的内部,在本例中为圆形。它只是我正在寻找的微妙效果:

enter image description here