自定义View使用BlurMaskFilter实现阴影效果

介绍

在自定义View的时候 我们可能需要对自定义View 做出一些阴影效果 在Android5.0后提供了Cardview 可以去轻松实现 其实还可以通过 paint.setMaskFilter(MaskFilter maskfilter) 去实现 参数MaskFilter 有2个子类

BlurMaskFilter:模糊遮罩滤镜 改变图像的透明度值来实现的

EmbossMaskFilter:浮雕遮罩滤镜 类似于灯光照射效果

使用:

BlurMaskFilter

new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID)

第一个参数代表阴影的半径值 第二个参数代表阴影的样式

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //绘制原图
        canvas.drawBitmap(bitmap,50,50,null);

        paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID));
        canvas.drawBitmap(bitmap,50,bitmap.getHeight()+100,paint);
        }

注意:使用paint.setMaskFilter()需要将硬件加速关闭 一般在自定义View的构造方法调用就行了 setLayerType(View.LAYER_TYPE_SOFTWARE,null) ;

效果:

上面那张图是没做任何处理的,下面使用了 paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID)); 给人的感觉就是图片浮起来一样 下面详细介绍BlurMaskFilter.Blur 中的几个常量的作用

  • BlurMaskFilter.Blur.SOLID

    图像边界外产生一层与图像颜色一致阴影效果,不影响图像的本身 通过上面的图也看到了 换一张色彩丰富的图再看看 感觉就不太对劲了阴影变成五颜六色的了 怎么解决

    后面再说

  • BlurMaskFilter.Blur.NORMAL

    整个图像都被模糊掉

  • BlurMaskFilter.Blur.OUTER

    图像边界外产生一层阴影,并且将图像变成透明效果

  • BlurMaskFilter.Blur.INNER

    在图像内部边沿产生模糊效果

解决彩色图片阴影问题

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //获取图片的色彩通道
        Bitmap bg_bimap=bitmap1.extractAlpha();
        //设置画笔为我们想要的颜色
        paint.setColor(Color.DKGRAY);
        //样式采用 NORMAL 或者 SOLID
        paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.NORMAL));
        //先画背景图片
        canvas.drawBitmap(bg_bimap,50,50,paint);
        //再画我们的前景图片
        canvas.drawBitmap(bitmap1,50,50,null);
        }

EmbossMaskFilter的使用:

这个API 使用的场景较少 就简单介绍下吧

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        RectF rectF=new RectF(200,200,500,500);
        /**
         * Create an emboss maskfilter
         *
         * @param direction  指定光源的位置,长度为xxx的数组标量[x,y,z]
         * @param ambient    环境光的因子 (0~1),越接近0,环境光越暗
         * @param specular   镜面反射系数 越接近0,镜面反射越强
         * @param blurRadius 模糊半径 值越大,模糊效果越明显
         */
        paint.setMaskFilter(new EmbossMaskFilter(new float[]{1,1,1},0.3f,60,80));
        canvas.drawRect(rectF,paint);
    }

这个类似浮雕的效果 至于使用场景需要自己去想象发挥了

简书责编内容来自:简书 (源链) | 更多关于

阅读提示:酷辣虫无法对本内容的真实性提供任何保证,请自行验证并承担相关的风险与后果!
本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 综合技术 » 自定义View使用BlurMaskFilter实现阴影效果

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录