詳解Paint的setMaskFilter(MaskFilter maskfilter)


一、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  尊重原作者,感謝作者的分享!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM