自定義View-第十四步:setShadowLayer陰影與SetMaskFilter發(fā)光效果

前言

根據(jù)啟艦 的博客所學(xué)習(xí)的自定義View魁兼。

一、setShadowLayer構(gòu)造函數(shù)

public void setShadowLayer(float radius, float dx, float dy, int color)  
  • radius:模糊半徑漠嵌,radius越大越模糊咐汞,越小越清晰,但是如果radius設(shè)置為0儒鹿,則陰影消失不見
  • dx:陰影的橫向偏移距離化撕,正值向右偏移,負值向左偏移
  • dy:陰影的縱向偏移距離约炎,正值向下偏移侯谁,負值向上偏移
  • color: 繪制陰影的畫筆顏色,即陰影的顏色(對圖片陰影無效)

注意:這里有一點需要非常注意的是setShadowLayer只有文字繪制陰影支持硬件加速章钾,其它都不支持硬件加速墙贱,所以為了方便起見,我們需要在自定義控件中禁用硬件加速贱傀。

二惨撇、實現(xiàn)對文本,圖形府寒,Image的陰影效果

void init(){
        setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
}
  @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setColor(Color.RED);
        paint.setStrokeWidth(2);
        paint.setAntiAlias(true);
        paint.setTextSize(50);
        paint.setShadowLayer(5, 15, 20, Color.GREEN);
        canvas.drawText("demo", 100, 100, paint);
        canvas.drawCircle(200, 200, 50, paint);
        canvas.drawBitmap(bitmap, null, new RectF(200, 300, 200 + bitmap.getWidth(), 300 + bitmap.getHeight()), paint);
    }
效果圖

三魁衙、 清除與顯示陰影

  • 顯示陰影就調(diào)用paint.setShadowLayer方法
  • 清除陰影就調(diào)用paint.clearShadowLayer()

四、TextView及其派生類使用ShadowLayer添加陰影效果

直接上代碼??

<TextView  
       …………  
        android:shadowRadius="3"  
        android:shadowDx="5"  
        android:shadowDy="5"  
        android:shadowColor="@android:color/darker_gray"/>  

或者

TextView tv = (TextView)findViewById(R.id.tv);  
tv.setShadowLayer(2,5,5, Color.GREEN);  

五株搔、SetMaskFilter之BlurMaskFilter實現(xiàn)發(fā)光效果

與setShadowLayer一樣剖淀,發(fā)光效果也是使用的高斯模糊,并且只會影響邊緣部分圖像纤房,內(nèi)部圖像是不受影響的
發(fā)光效果是無法指定發(fā)光顏色的纵隔,采用邊緣部分的顏色取樣來進行模糊發(fā)光。所以邊緣是什么顏色炮姨,發(fā)出的光也就是什么顏色的捌刮。

1. 基本方法

public MaskFilter setMaskFilter(MaskFilter maskfilter)  
public BlurMaskFilter(float radius, Blur style)  
  • float radius:用來定義模糊半徑,同樣是高斯模糊算法舒岸。
  • Blur style:發(fā)光樣式绅作,有內(nèi)發(fā)光、外發(fā)光蛾派、和內(nèi)外發(fā)光俄认,分別對應(yīng):Blur.INNER(內(nèi)發(fā)光)个少、Blur.SOLID(外發(fā)光)、Blur.NORMAL(內(nèi)外發(fā)光)眯杏、Blur.OUTER(僅發(fā)光部分可見)夜焦,
void init(){
......
        setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
}
 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.BLACK);
        canvas.drawText("正常",30,100,paint);
        Paint paint1 = new Paint();
        paint1.setColor(Color.RED);
        paint1.setStyle(Paint.Style.FILL);
        canvas.drawCircle(300, 100, 50, paint1);

        canvas.drawText("INNER",0,250,paint);
        Paint paint2 = new Paint();
        paint2.setColor(Color.RED);
        paint2.setStyle(Paint.Style.FILL);
        paint2.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.INNER));
        canvas.drawCircle(300, 250, 50, paint2);

        canvas.drawText("OUTER",0,400,paint);
        Paint paint3 = new Paint();
        paint3.setColor(Color.RED);
        paint3.setStyle(Paint.Style.FILL);
        paint3.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.OUTER));
        canvas.drawCircle(300, 400, 50, paint3);

        canvas.drawText("NORMAL",0,550,paint);
        Paint paint4 = new Paint();
        paint4.setColor(Color.RED);
        paint4.setStyle(Paint.Style.FILL);
        paint4.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.NORMAL));
        canvas.drawCircle(300, 550, 50, paint4);
    }
效果圖

2. 圖片發(fā)光
其實實現(xiàn)方式和上邊的一樣的,不過,這里我們先說一個小知識** extraAlpha()函數(shù)**:

extractAlpha()新建一張僅具有Alpha值的空白圖像
這張圖像的顏色役拴,是由canvas.drawBitmap時的畫筆指定的糊探。

舉個栗子:

void init(){
......
        setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速
}
  //初始化
    private void initBitmap() {
        bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bear);
        mBitmap = bitmap.extractAlpha();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.BLACK);
        paint.setColor(Color.GREEN);
        canvas.drawBitmap(mBitmap, null, new RectF(100, 100, 100 + mBitmap.getWidth(), mBitmap.getHeight() + 100), paint);

        canvas.drawBitmap(bitmap, null, new RectF(100, 300, 100 + bitmap.getWidth(), bitmap.getHeight() + 300), paint);
    }
效果圖

那么钾埂,接下來我們就將這兩個圖發(fā)光吧河闰!
其實還是這兩句話,哈哈

    mPaint.setColor(mShadowColor);//設(shè)置發(fā)光的顏色
    mPaint.setMaskFilter(new BlurMaskFilter(mRadius, BlurMaskFilter.Blur.NORMAL));//設(shè)置發(fā)光樣式,NORMAL是內(nèi)外發(fā)光

具體源碼:

       setLayerType(LAYER_TYPE_SOFTWARE, null);//對單獨的View在運行時階段禁用硬件加速

        paint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));
        paint.setColor(Color.GREEN);
        canvas.drawBitmap(mBitmap, null, new RectF(100, 100, 100 + mBitmap.getWidth(), mBitmap.getHeight() + 100), paint);

        paint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));
        canvas.drawBitmap(bitmap, null, new RectF(100, 300, 100 + bitmap.getWidth(), bitmap.getHeight() + 300), paint);

效果圖為【可以對比上面未發(fā)光的效果圖】:

BlurMaskFilter

后記

由于作者君偷懶褥紫,所以paint的創(chuàng)建呀什么的姜性,全都放在onDraw里面了,大家寫代碼的時候髓考,要使onDraw輕量部念。不要直接放進去,在外面初始化哈~
感謝大家提出的問題氨菇,筆芯~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末儡炼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子查蓉,更是在濱河造成了極大的恐慌乌询,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豌研,死亡現(xiàn)場離奇詭異妹田,居然都是意外死亡,警方通過查閱死者的電腦和手機鹃共,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門鬼佣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霜浴,你說我怎么就攤上這事晶衷。” “怎么了阴孟?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵房铭,是天一觀的道長。 經(jīng)常有香客問我温眉,道長缸匪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任类溢,我火速辦了婚禮凌蔬,結(jié)果婚禮上露懒,老公的妹妹穿的比我還像新娘。我一直安慰自己砂心,他們只是感情好懈词,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辩诞,像睡著了一般坎弯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上译暂,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天抠忘,我揣著相機與錄音,去河邊找鬼外永。 笑死崎脉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的伯顶。 我是一名探鬼主播囚灼,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祭衩!你這毒婦竟也來了灶体?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掐暮,失蹤者是張志新(化名)和其女友劉穎蝎抽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫乱,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡织中,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衷戈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭吼。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖殖妇,靈堂內(nèi)的尸體忽然破棺而出刁笙,到底是詐尸還是另有隱情,我是刑警寧澤谦趣,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布疲吸,位于F島的核電站,受9級特大地震影響前鹅,放射性物質(zhì)發(fā)生泄漏摘悴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一舰绘、第九天 我趴在偏房一處隱蔽的房頂上張望蹂喻。 院中可真熱鬧葱椭,春花似錦逛揩、人聲如沸双絮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至峡钓,卻和暖如春考婴,著一層夾襖步出監(jiān)牢的瞬間剔蹋,已是汗流浹背赤嚼。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工旷赖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人探膊。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓杠愧,卻偏偏與公主長得像待榔,于是被迫代替她去往敵國和親逞壁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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