安卓自定義 View 踩坑筆記,特作文記錄
安卓 Paint 類用于自定義 View 時↑這兩個方法能用來干嘛我就不細說了,大家應(yīng)該都了解,總結(jié)而言我們可以用這兩個方法給要繪制的東西添加陰影和發(fā)光效果。發(fā)光效果我們這里只討論內(nèi)外發(fā)光。
這倆方法在大多數(shù)場景下要生效都需關(guān)閉硬件加速,這點大家肯定都知道。有時我們需要把陰影或發(fā)光效果應(yīng)用在繪制圖片(Bitmap)時,此時 UI 給你切的小圖標很可能是邊緣會有一大圈純透明像素,此時你會發(fā)現(xiàn)給 Paint 設(shè)置了上面兩個函數(shù)后得不到想要的效果。
問題其實就出在切圖邊緣有純透明像素上。
我們直接上圖來看看效果。
比如吧我現(xiàn)在有張圖長這樣:

原圖
這是我從 AS 里打開圖片后截的預覽效果圖,注意它邊緣那一大圈透明像素。我們繪制此圖片時想給它加個陰影效果:
mArcPaint.setShadowLayer(20, dp2px(15), dp2px(15), Color.parseColor("#333333"));//dp2px干嘛的大家肯定能猜到
canvas.drawBitmap(mArrow, matrix, mArcPaint);//mArrow 就是我們待繪制的 Bitmap 對象
mArcPaint.clearShadowLayer();
繪制到畫布上是這么個尷尬樣子:

原圖1繪制陰影1
我們把模糊半徑設(shè)置成 0 :
mArcPaint.setShadowLayer(0, dp2px(15), dp2px(15), Color.parseColor("#333333"));//dp2px干嘛的大家肯定能猜到
canvas.drawBitmap(mArrow, matrix, mArcPaint);//mArrow 就是我們待繪制的 Bitmap 對象
mArcPaint.clearShadowLayer();
會變成這樣:

原圖1繪制陰影2
看著只有原圖了!
此時我們把原圖改成這樣:

原圖2
嗯周圍沒有純透明像素了,此時再把模糊半徑改大點:
mArcPaint.setShadowLayer(128, dp2px(15), dp2px(15), Color.parseColor("#333333"));//dp2px干嘛的大家肯定能猜到
canvas.drawBitmap(mArrow, matrix, mArcPaint);//mArrow 就是我們待繪制的 Bitmap 對象
mArcPaint.clearShadowLayer();
此時繪制到畫布上是這樣的:

原圖2繪制陰影
相信我上面已經(jīng)說的很明白了!
發(fā)光效果沒畫出來也是如此。
發(fā)光效果的設(shè)置代碼大概長這樣:
mArcPaint.setMaskFilter(new BlurMaskFilter(dp2px(4), BlurMaskFilter.Blur.NORMAL));//生產(chǎn)環(huán)境里千萬不要在onDraw 函數(shù)里 new 對象!會 OOM 的
canvas.drawBitmap(mArrow, matrix, mArcPaint);
mArcPaint.setMaskFilter(null);
原圖:

原圖
內(nèi)外發(fā)光效果繪制到畫布上:

原圖繪制內(nèi)外發(fā)光
完。