介紹
在自定義View的時候 我們可能需要對自定義View 做出一些陰影效果 在Android5.0后提供了Cardview 可以去輕松實現(xiàn) 其實還可以通過paint.setMaskFilter(MaskFilter maskfilter)
去實現(xiàn) 參數(shù)MaskFilter 有2個子類
BlurMaskFilter:模糊遮罩濾鏡 改變圖像的透明度值來實現(xiàn)的
EmbossMaskFilter:浮雕遮罩濾鏡 類似于燈光照射效果
使用:
BlurMaskFilter
new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID)
第一個參數(shù)代表陰影的半徑值 第二個參數(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)
;
效果:
上面那張圖是沒做任何處理的,下面使用了 paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID));
給人的感覺就是圖片浮起來一樣 下面詳細(xì)介紹BlurMaskFilter.Blur 中的幾個常量的作用
-
BlurMaskFilter.Blur.SOLID
圖像邊界外產(chǎn)生一層與圖像顏色一致陰影效果,不影響圖像的本身 通過上面的圖也看到了 換一張色彩豐富的圖再看看 感覺就不太對勁了陰影變成五顏六色的了 怎么解決
后面再說
-
BlurMaskFilter.Blur.NORMAL
整個圖像都被模糊掉
-
BlurMaskFilter.Blur.OUTER
圖像邊界外產(chǎn)生一層陰影形病,并且將圖像變成透明效果
-
BlurMaskFilter.Blur.INNER
在圖像內(nèi)部邊沿產(chǎn)生模糊效果
解決彩色圖片陰影問題
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//獲取圖片的色彩通道
Bitmap bg_bimap=bitmap1.extractAlpha();
//設(shè)置畫筆為我們想要的顏色
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的數(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);
}
這個類似浮雕的效果 至于使用場景需要自己去想象發(fā)揮了