Paint API之—— MaskFilter(面具)

導航

Android Paint之顏色過濾器

Paint之shader(圖像渲染)

Paint之PathEffect(路徑效果)

Paint API之—— MaskFilter(面具)

android之繪圖工具類詳解

Paint API之—— Xfermode與PorterDuff全面詳解

Paint API之—— Xfermode與PorterDuff詳解(三)動畫效果

Paint枚舉、常量值、陰影效果、字體

本節前言

前面學習繪圖的的時候我們講過,Paint中有這樣一個方法:
setMaskFilter(MaskFilter maskfilter): 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等! 而我們一般不會直接去用這個MaskFilter,而是使用它的兩個子類:

BlurMaskFilter:指定了一個模糊的樣式和半徑來處理Paint的邊緣。

EmbossMaskFilter:指定了光源的方向和環境光強度來添加浮雕效果。 下面我們來寫個例子來試驗一下~!

1.BlurMaskFilter(模糊效果)

說什么濾鏡立體,誰知道怎么樣,示例見真知:

代碼示例
運行效果圖

實現代碼
這里我們創建一個自定義View,在里面完成繪制!

BlurMaskFilterView.java

public class BlurMaskFilterView extends View{

    public BlurMaskFilterView(Context context) {
        super(context);
    }

    public BlurMaskFilterView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public BlurMaskFilterView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        BlurMaskFilter bmf = null;
        Paint paint=new Paint();
        paint.setAntiAlias(true);          //抗鋸齒
        paint.setColor(Color.RED);//畫筆顏色
        paint.setStyle(Paint.Style.FILL);  //畫筆風格
        paint.setTextSize(68);             //繪制文字大小,單位px
        paint.setStrokeWidth(5);           //畫筆粗細

        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜歡看曹神日狗了~", 100, 100, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.OUTER);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜歡看曹神日狗了~", 100, 200, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.INNER);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜歡看曹神日狗了~", 100, 300, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.SOLID);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜歡看曹神日狗了~", 100, 400, paint);
        
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //關閉硬件加速
    }
}

好的,從上面的代碼示例,我們可以發現,我們使用這個BlurMaskFilter,無非是, 在構造方法中實例化:
BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL);
我們可以控制的就是這兩個參數:
第一個參數:指定模糊邊緣的半徑;
第二個參數:指定模糊的風格,可選值有:
BlurMaskFilter.Blur.NORMAL:內外模糊
BlurMaskFilter.Blur.OUTER:外部模糊
BlurMaskFilter.Blur.INNER:內部模糊
BlurMaskFilter.Blur.SOLID:內部加粗,外部模糊

可能還是有點不清晰,我們找個圖片來試試:

這里我們把模糊半徑修改成了50,就更加明顯了~

2.EmbossMaskFilter(浮雕效果)

如題,通過指定環境光源的方向和環境光強度來添加浮雕效果,同樣,我們寫個示例來看看效果:

代碼示例
運行效果圖

實現代碼

public class EmbossMaskFilterView extends View{

    public EmbossMaskFilterView(Context context) {
        super(context);
    }

    public EmbossMaskFilterView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmbossMaskFilterView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float[] direction = new float[]{ 1, 1, 3 };   // 設置光源的方向
        float light = 0.4f;     //設置環境光亮度
        float specular = 8;     // 定義鏡面反射系數
        float blur = 3.0f;      //模糊半徑
        EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);

        Paint paint = new Paint();
        paint.setAntiAlias(true);          //抗鋸齒
        paint.setColor(Color.BLUE);//畫筆顏色
        paint.setStyle(Paint.Style.FILL);  //畫筆風格
        paint.setTextSize(70);             //繪制文字大小,單位px
        paint.setStrokeWidth(8);           //畫筆粗細
        paint.setMaskFilter(emboss);

        paint.setMaskFilter(emboss);
        canvas.drawText("最喜歡看曹神日狗了~", 50, 100, paint);


        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_bg_meizi1);
        canvas.drawBitmap(bitmap, 150, 200, paint);

        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //關閉硬件加速
    }
}

從效果圖我們就可以看出一些EmbossMaskFilter的效果,修改光線,形成浮雕效果~妹子圖不明顯, 文字就很清晰顯示出紋路了!和BlurMaskFilter一樣,相關的設置都是在構造方法中進行!
EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius) 參數依次是:
direction:浮點型數組,用于控制x,y,z軸的光源方向
ambient:設置環境光亮度,0到1之間
specular:鏡面反射系數
blurRadius:模糊半徑
你可以修改這些值,試試不同的效果,比如我修改下上述的,又會是另一種效果:
//這里為了明顯點,換成了綠色

3.注意事項

在使用MaskFilter的時候要注意,當我們的targetSdkVersion >= 14的時候,MaskFilter 就不會起效果了,這是因為Android在API 14以上版本都是默認開啟硬件加速的,這樣充分 利用GPU的特性,使得繪畫更加平滑,但是會多消耗一些內存!好吧,我們把硬件加速關了 就好,可以在不同級別下打開或者關閉硬件加速,一般是關閉~

Application:在配置文件的application節點添加:android:hardwareAccelerated="true"

Activity:在配置文件的activity節點添加android:hardwareAccelerated="false"

View:可以獲得View對象后調用,或者直接在View的onDraw()方法里設置: view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,745評論 25 708
  • 系列文章之 Android中自定義View(一)系列文章之 Android中自定義View(二)系列文章之 And...
    YoungerDev閱讀 2,199評論 0 4
  • 1、Linux 命令 http://linuxtools-rst.readthedocs.io/zh_CN/lat...
    yono閱讀 625評論 0 49
  • 憤怒,就是讓人感到害怕的一種感受,有時被看作是一種“負面”情緒。憤怒是人們對于失去控制、過度控制、無能為力、缺乏控...
    89a3a545b116閱讀 448評論 0 0
  • 今天的課程內容是同理心。 派單過程中,被無數次拒絕甚至遇到一些不那么友善的客戶,試著用同理心去...
    思思FineYoga閱讀 146評論 1 3