介绍
在自定义View的时候 我们可能需要对自定义View 做出一些阴影效果 在Android5.0后提供了Cardview 可以去轻松实现 其实还可以通过paint.setMaskFilter(MaskFilter maskfilter)
去实现 参数MaskFilter 有2个子类
![](https://img.haomeiwen.com/i2158254/06c9ea6af4f7773f.png)
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)
;
效果:
![](https://img.haomeiwen.com/i2158254/a723c3c6e28d27d0.png)
上面那张图是没做任何处理的,下面使用了 paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID));
给人的感觉就是图片浮起来一样 下面详细介绍BlurMaskFilter.Blur 中的几个常量的作用
-
BlurMaskFilter.Blur.SOLID
图像边界外产生一层与图像颜色一致阴影效果,不影响图像的本身 通过上面的图也看到了 换一张色彩丰富的图再看看 感觉就不太对劲了阴影变成五颜六色的了 怎么解决
后面再说
![](https://img.haomeiwen.com/i2158254/083faf5f3e918cdc.png)
-
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);
}
![](https://img.haomeiwen.com/i2158254/b1ae4307b34ab5c8.png)
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);
}
![](https://img.haomeiwen.com/i2158254/281cf081d7a688ac.png)
这个类似浮雕的效果 至于使用场景需要自己去想象发挥了
网友评论