如何在Android中实现羽化效果?

4
我正在尝试创建一个椭圆形位图,我需要在边缘周围产生羽化效果。有人知道如何实现吗?谢谢。
1个回答

9
你可以将“羽化效果”视为渐变的一种,其中 alpha 从 100% 渐变到 0%。
Android 提供了 RadialGradient 类来实现此目的。您需要使用可以指定梯度控制点的构造函数,因为您希望淡出从边缘开始,而不是从中间开始。
Android 的 RadialGradient 类存在一个问题,即它仅支持完美圆形,而不支持椭圆形。为了弥补这一点,我们将绘制一个完美的圆圈并在之后进行缩放。
示例代码:
    private Bitmap makeFeatheredOval(int width, int height) { 

        // Determine largest dimension, use for rectangle.
        int size = Math.max( width, height);

        RadialGradient gradient = new RadialGradient(size / 2, size / 2, size / 2, 
            new int[] {0xFFFFFFFF, 0xFFFFFFFF, 0x00FFFFFF},
            new float[] {0.0f, 0.8f, 1.0f}, 
            android.graphics.Shader.TileMode.CLAMP); 
        Paint paint = new Paint(); 
        paint.setShader(gradient); 

        Bitmap bitmap = Bitmap.createBitmap(size, size, Config.ARGB_8888); 
        Canvas canvas = new Canvas(bitmap); 
        canvas.drawCircle(size / 2, size / 2, size / 2, paint);

        // Scale the bitmap, creating an oval
        bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);

        return bitmap; 
    }

示例图片(它是左上角的椭圆形“月亮”):

Oval circle overlayed on demoscene awesomeness

谁能认出背景图片,就有额外积分。


你好,非常感谢你的帮助,但我需要在已经创建的位图(裁剪后的位图)周围创建羽毛效果。这是我使用的代码:Bitmap croppedImage = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(croppedImage); Rect dstRect = new Rect(0, 0, width, height); canvas.drawBitmap(initialBitmap, r, dstRect, null);最后进行裁剪:Path p = mCrop.getCropPath(); Canvas c = new Canvas(croppedImage); c.clipPath(p, Region.Op.DIFFERENCE); c.drawColor(0x00000000, PorterDuff.Mode.CLEAR); - cataHHH
抱歉不知道说得清不清楚...我已经尝试添加各种画笔效果到被裁剪的图像上,但是我从未注意到它的边缘上出现任何东西。 - cataHHH
通过缩放渐变圆来制作椭圆的不错解决方法。 - gnorsilva
你应该考虑应用高斯滤波。 - Aiden Strydom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接