介紹
在自定義View的時(shí)候 我們可能需要對(duì)自定義View 做出一些陰影效果 在Android5.0后提供了Cardview 可以去輕松實(shí)現(xiàn) 其實(shí)還可以通過(guò)paint.setMaskFilter(MaskFilter maskfilter)去實(shí)現(xiàn) 參數(shù)MaskFilter 有2個(gè)子類(lèi)

BlurMaskFilter:模糊遮罩濾鏡 改變圖像的透明度值來(lái)實(shí)現(xiàn)的
EmbossMaskFilter:浮雕遮罩濾鏡 類(lèi)似于燈光照射效果
使用:
BlurMaskFilter
new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID)
第一個(gè)參數(shù)代表陰影的半徑值 第二個(gè)參數(shù)代表陰影的樣式
@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()需要將硬件加速關(guān)閉 一般在自定義View的構(gòu)造方法調(diào)用就行了 setLayerType(View.LAYER_TYPE_SOFTWARE,null);
效果:

上面那張圖是沒(méi)做任何處理的,下面使用了 paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID)); 給人的感覺(jué)就是圖片浮起來(lái)一樣 下面詳細(xì)介紹BlurMaskFilter.Blur 中的幾個(gè)常量的作用
-
BlurMaskFilter.Blur.SOLID
圖像邊界外產(chǎn)生一層與圖像顏色一致陰影效果,不影響圖像的本身 通過(guò)上面的圖也看到了 換一張色彩豐富的圖再看看 感覺(jué)就不太對(duì)勁了陰影變成五顏六色的了 怎么解決
后面再說(shuō)

-
BlurMaskFilter.Blur.NORMAL
整個(gè)圖像都被模糊掉
-
BlurMaskFilter.Blur.OUTER
圖像邊界外產(chǎn)生一層陰影,并且將圖像變成透明效果
-
BlurMaskFilter.Blur.INNER
在圖像內(nèi)部邊沿產(chǎn)生模糊效果
解決彩色圖片陰影問(wèn)題
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//獲取圖片的色彩通道
Bitmap bg_bimap=bitmap1.extractAlpha();
//設(shè)置畫(huà)筆為我們想要的顏色
paint.setColor(Color.DKGRAY);
//樣式采用 NORMAL 或者 SOLID
paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.NORMAL));
//先畫(huà)背景圖片
canvas.drawBitmap(bg_bimap,50,50,paint);
//再畫(huà)我們的前景圖片
canvas.drawBitmap(bitmap1,50,50,null);
}

EmbossMaskFilter的使用:
這個(gè)API 使用的場(chǎng)景較少 就簡(jiǎn)單介紹下吧
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
RectF rectF=new RectF(200,200,500,500);
/**
* Create an emboss maskfilter
*
* @param direction 指定光源的位置,長(zhǎng)度為xxx的數(shù)組標(biāo)量[x,y,z]
* @param ambient 環(huán)境光的因子 (0~1),越接近0,環(huán)境光越暗
* @param specular 鏡面反射系數(shù) 越接近0,鏡面反射越強(qiáng)
* @param blurRadius 模糊半徑 值越大,模糊效果越明顯
*/
paint.setMaskFilter(new EmbossMaskFilter(new float[]{1,1,1},0.3f,60,80));
canvas.drawRect(rectF,paint);
}

這個(gè)類(lèi)似浮雕的效果 至于使用場(chǎng)景需要自己去想象發(fā)揮了


