Paint API之—— MaskFilter(面具)

導(dǎo)航

Android Paint之顏色過濾器

Paint之shader(圖像渲染)

Paint之PathEffect(路徑效果)

Paint API之—— MaskFilter(面具)

android之繪圖工具類詳解

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

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

Paint枚舉笼平、常量值奈揍、陰影效果、字體

本節(jié)前言

前面學(xué)習(xí)繪圖的的時候我們講過幼驶,Paint中有這樣一個方法:
setMaskFilter(MaskFilter maskfilter): 設(shè)置MaskFilter,可以用不同的MaskFilter實現(xiàn)濾鏡的效果,如濾化值桩,立體等羡疗! 而我們一般不會直接去用這個MaskFilter染服,而是使用它的兩個子類:

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

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

1.BlurMaskFilter(模糊效果)

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

代碼示例
運行效果圖

實現(xiàn)代碼
這里我們創(chuàng)建一個自定義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);  //畫筆風(fēng)格
        paint.setTextSize(68);             //繪制文字大小,單位px
        paint.setStrokeWidth(5);           //畫筆粗細(xì)

        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);     //關(guān)閉硬件加速
    }
}

好的蚕甥,從上面的代碼示例哪替,我們可以發(fā)現(xiàn),我們使用這個BlurMaskFilter菇怀,無非是凭舶, 在構(gòu)造方法中實例化:
BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL);
我們可以控制的就是這兩個參數(shù):
第一個參數(shù):指定模糊邊緣的半徑;
第二個參數(shù):指定模糊的風(fēng)格爱沟,可選值有:
BlurMaskFilter.Blur.NORMAL:內(nèi)外模糊
BlurMaskFilter.Blur.OUTER:外部模糊
BlurMaskFilter.Blur.INNER:內(nèi)部模糊
BlurMaskFilter.Blur.SOLID:內(nèi)部加粗帅霜,外部模糊

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

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

2.EmbossMaskFilter(浮雕效果)

如題身冀,通過指定環(huán)境光源的方向和環(huán)境光強度來添加浮雕效果,同樣蜂大,我們寫個示例來看看效果:

代碼示例
運行效果圖

實現(xiàn)代碼

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 };   // 設(shè)置光源的方向
        float light = 0.4f;     //設(shè)置環(huán)境光亮度
        float specular = 8;     // 定義鏡面反射系數(shù)
        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);  //畫筆風(fēng)格
        paint.setTextSize(70);             //繪制文字大小闽铐,單位px
        paint.setStrokeWidth(8);           //畫筆粗細(xì)
        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);     //關(guān)閉硬件加速
    }
}

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

3.注意事項

在使用MaskFilter的時候要注意,當(dāng)我們的targetSdkVersion >= 14的時候遥椿,MaskFilter 就不會起效果了基矮,這是因為Android在API 14以上版本都是默認(rèn)開啟硬件加速的,這樣充分 利用GPU的特性冠场,使得繪畫更加平滑家浇,但是會多消耗一些內(nèi)存!好吧碴裙,我們把硬件加速關(guān)了 就好钢悲,可以在不同級別下打開或者關(guān)閉硬件加速点额,一般是關(guān)閉~

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莺琳,一起剝皮案震驚了整個濱河市还棱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦昔,老刑警劉巖诱贿,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咕缎,居然都是意外死亡珠十,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門凭豪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焙蹭,“玉大人,你說我怎么就攤上這事嫂伞】桌鳎” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵帖努,是天一觀的道長撰豺。 經(jīng)常有香客問我,道長拼余,這世上最難降的妖魔是什么污桦? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮匙监,結(jié)果婚禮上凡橱,老公的妹妹穿的比我還像新娘。我一直安慰自己亭姥,他們只是感情好稼钩,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著达罗,像睡著了一般坝撑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上粮揉,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天绍载,我揣著相機與錄音,去河邊找鬼滔蝉。 笑死,一個胖子當(dāng)著我的面吹牛塔沃,可吹牛的內(nèi)容都是我干的蝠引。 我是一名探鬼主播阳谍,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼螃概!你這毒婦竟也來了矫夯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤吊洼,失蹤者是張志新(化名)和其女友劉穎训貌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冒窍,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡递沪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了综液。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片款慨。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谬莹,靈堂內(nèi)的尸體忽然破棺而出檩奠,到底是詐尸還是另有隱情,我是刑警寧澤附帽,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布埠戳,位于F島的核電站,受9級特大地震影響蕉扮,放射性物質(zhì)發(fā)生泄漏整胃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一慢显、第九天 我趴在偏房一處隱蔽的房頂上張望爪模。 院中可真熱鬧,春花似錦荚藻、人聲如沸屋灌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽共郭。三九已至,卻和暖如春疾呻,著一層夾襖步出監(jiān)牢的瞬間除嘹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工岸蜗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尉咕,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓璃岳,卻偏偏與公主長得像年缎,于是被迫代替她去往敵國和親悔捶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,524評論 25 707
  • 系列文章之 Android中自定義View(一)系列文章之 Android中自定義View(二)系列文章之 And...
    YoungerDev閱讀 2,159評論 0 4
  • 1单芜、Linux 命令 http://linuxtools-rst.readthedocs.io/zh_CN/lat...
    yono閱讀 608評論 0 49
  • 憤怒蜕该,就是讓人感到害怕的一種感受,有時被看作是一種“負(fù)面”情緒洲鸠。憤怒是人們對于失去控制堂淡、過度控制、無能為力扒腕、缺乏控...
    89a3a545b116閱讀 426評論 0 0
  • 今天的課程內(nèi)容是同理心绢淀。 派單過程中,被無數(shù)次拒絕甚至遇到一些不那么友善的客戶袜匿,試著用同理心去...
    思思FineYoga閱讀 143評論 1 3