一、setMaskFilter(MaskFilter maskfilter)
setMaskFilter(MaskFilter maskfilter)是paint中的方法,它可以用來對圖像進行一定的處理。這個方法需要傳入一個MaskFilter對象。但MaskFilter類中沒有任何實現方法,所以我們就要認識下它的兩個子類BlurMaskFilter和EmbossMaskFilter,前者為模糊遮罩濾鏡而后者為浮雕遮罩濾鏡。
二、BlurMaskFilter
2.1 初識
我們在之前的cardView中講解到cardview可以設置陰影效果,我先擺出之前文章的圖片。
使用BlurMaskFilter可以輕松實現上面的陰影效果。
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setColor(Color.RED); // 設置畫筆遮罩濾鏡 ,傳入度數和樣式 mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.SOLID)); // 畫一個矩形 canvas.drawRect(200, 200, 600, 600, mPaint); }
說明:這個方法已經被標注為過時的方法了,如果你的應用啟用了硬件加速,你是看不到任何陰影效果的。
如果在AndroidManifest.xml文件中關閉硬件加速那么我們整個應用都將不支持硬件加速,這顯然是不科學的,如果可以只針對某個View關閉硬件加速那豈不是很好么?當然,Android也給我們提供了這樣的功能,我們可以在View中通過:
setLayerType(LAYER_TYPE_SOFTWARE, null);
來關閉單個View的硬件加速功能。
2.2 構造函數
BlurMaskFilter只有一個含參的構造函數
BlurMaskFilter(float radius, BlurMaskFilter.Blur style)
第一個參數:radius很容易理解,值越大我們的陰影越擴散,用過PS的人會很容易理解,其實就是陰影范圍。
第二個參數:style表示的是模糊的類型,上面我們用到的是SOLID,其效果就是在圖像的Alpha邊界外產生一層與Paint顏色一致的陰影效果而不影響圖像本身,除了SOLID還有三種,NORMAL,OUTER和INNER。我們來逐個看看效果:
SOLID
其效果就是在圖像的Alpha邊界外產生一層與Paint顏色一致的陰影效果而不影響圖像本身。
因為陰影的顏色是從色塊中取出的,也是紅色的,所以你感覺不是很舒服,如果陰影是黑色的就好很多了。
NORMAL
會將整個圖像模糊掉。
OUTER
會在Alpha邊界外產生一層陰影且會將原本的圖像變透明。
INNER
會在圖像內部產生模糊。可以看見陰影在色塊的內部,有種淡淡的浮雕感。
INNER效果其實並不理想,實際應用中我們使用的也少。
2.3 給圖片添加陰影
BlurMaskFilter是根據Alpha通道的邊界來計算模糊的,如果用它對圖片進行處理,你會發現沒有任何效果。那么我們如何給圖片加一個類似陰影的效果呢?其實很簡單,我們可以嘗試從Bitmap中獲取其Alpha通道,並在繪制Bitmap前先以該Alpha通道繪制一個模糊效果就就行了。最終效果就是陰影圖片疊加到原圖的下方。
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap srcBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.kale); // 獲取位圖的Alpha通道圖 Bitmap shadowBitmap = srcBitmap.extractAlpha(); mPaint.setColor(Color.DKGRAY); // 設置畫筆遮罩濾鏡 ,傳入度數和樣式 mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL)); // 先繪制陰影 canvas.drawBitmap(shadowBitmap, 200, 200, mPaint); // 畫原圖 canvas.drawBitmap(srcBitmap, 200, 200, null); }
如果你好奇,底部的陰影圖片是什么樣子的,我們就不繪制原圖,僅僅繪制后面的陰影圖片看看。
三、EmbossMaskFilter
3.1 初識
相對於之前的BlurMaskFilter來說,EmbossMaskFilter的可用性比較低,因為它實現的效果不是很霸氣。正如其名,他可以實現一種類似浮雕的效果,說白了就是讓你繪制的圖像感覺像是從屏幕中“凸”起來更有立體感一樣(在設計軟件中類似的效果稱之為斜面浮雕)。
3.2 構造函數
EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)
這里面的各種參數理解起來比較復雜,如果想要詳細的了解可以去看:http://blog.csdn.net/aigestudio/article/details/41447349
我這里就不做什么說明了,因為做浮雕的畫,找ps就好了。
說明:本文大部分來自:http://blog.csdn.net/aigestudio/article/details/41316141,我對原文有細小的刪減,記錄在此作為學習筆記之用。
From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 尊重原作者,感謝作者的分享!