安卓自定義 View 踩坑筆記,特做文記錄java
安卓 Paint 類用於自定義 View 時↑這兩個方法能用來幹嗎我就不細說了,你們應該都瞭解,總結而言咱們能夠用這兩個方法給要繪製的東西添加陰影和發光效果。發光效果咱們這裏只討論內外發光。canvas
這倆方法在大多數場景下要生效都需關閉硬件加速,這點你們確定都知道。有時咱們須要把陰影或發光效果應用在繪製圖片(Bitmap)時,此時 UI 給你切的小圖標極可能是邊緣會有一大圈純透明像素,此時你會發現給 Paint 設置了上面兩個函數後得不到想要的效果。函數
問題其實就出在切圖邊緣有純透明像素上。spa
咱們直接上圖來看看效果。3d
好比吧我如今有張圖長這樣:code
這是我從 AS 裏打開圖片後截的預覽效果圖,注意它邊緣那一大圈透明像素。咱們繪製此圖片時想給它加個陰影效果:cdn
mArcPaint.setShadowLayer(20, dp2px(15), dp2px(15), Color.parseColor("#333333"));//dp2px幹嗎的你們確定能猜到
canvas.drawBitmap(mArrow, matrix, mArcPaint);//mArrow 就是咱們待繪製的 Bitmap 對象
mArcPaint.clearShadowLayer();
複製代碼
繪製到畫布上是這麼個尷尬樣子:對象
咱們把模糊半徑設置成 0 :blog
mArcPaint.setShadowLayer(0, dp2px(15), dp2px(15), Color.parseColor("#333333"));//dp2px幹嗎的你們確定能猜到
canvas.drawBitmap(mArrow, matrix, mArcPaint);//mArrow 就是咱們待繪製的 Bitmap 對象
mArcPaint.clearShadowLayer();
複製代碼
會變成這樣:圖片
看着只有原圖了!
此時咱們把原圖改爲這樣:
嗯周圍沒有純透明像素了,此時再把模糊半徑改大點:
mArcPaint.setShadowLayer(128, dp2px(15), dp2px(15), Color.parseColor("#333333"));//dp2px幹嗎的你們確定能猜到
canvas.drawBitmap(mArrow, matrix, mArcPaint);//mArrow 就是咱們待繪製的 Bitmap 對象
mArcPaint.clearShadowLayer();
複製代碼
此時繪製到畫布上是這樣的:
相信我上面已經說的很明白了!
發光效果沒畫出來也是如此。
發光效果的設置代碼大概長這樣:
mArcPaint.setMaskFilter(new BlurMaskFilter(dp2px(4), BlurMaskFilter.Blur.NORMAL));//生產環境裏千萬不要在onDraw 函數裏 new 對象!會 OOM 的
canvas.drawBitmap(mArrow, matrix, mArcPaint);
mArcPaint.setMaskFilter(null);
複製代碼
原圖:
內外發光效果繪製到畫布上:
完。