安卓畫筆setShadowLayer與SetMaskFilter繪制圖片無效

安卓自定義 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ā)光

完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容