自定义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);

效果:

自定义View使用BlurMaskFilter实现阴影效果_第1张图片

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

  • BlurMaskFilter.Blur.SOLID

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

自定义View使用BlurMaskFilter实现阴影效果_第2张图片
  • BlurMaskFilter.Blur.NORMAL
    整个图像都被模糊掉

    自定义View使用BlurMaskFilter实现阴影效果_第3张图片

  • BlurMaskFilter.Blur.OUTER

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


    自定义View使用BlurMaskFilter实现阴影效果_第4张图片
  • BlurMaskFilter.Blur.INNER
    在图像内部边沿产生模糊效果

    自定义View使用BlurMaskFilter实现阴影效果_第5张图片

解决彩色图片阴影问题

@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);
        }
自定义View使用BlurMaskFilter实现阴影效果_第6张图片

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);
    }
        
自定义View使用BlurMaskFilter实现阴影效果_第7张图片

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

你可能感兴趣的:(自定义View使用BlurMaskFilter实现阴影效果)