自定義View使用BlurMaskFilter實(shí)現(xiàn)陰影效果

介紹

在自定義View的時(shí)候 我們可能需要對(duì)自定義View 做出一些陰影效果 在Android5.0后提供了Cardview 可以去輕松實(shí)現(xiàn) 其實(shí)還可以通過(guò)paint.setMaskFilter(MaskFilter maskfilter)去實(shí)現(xiàn) 參數(shù)MaskFilter 有2個(gè)子類(lèi)


BlurMaskFilter:模糊遮罩濾鏡 改變圖像的透明度值來(lái)實(shí)現(xiàn)的
EmbossMaskFilter:浮雕遮罩濾鏡 類(lèi)似于燈光照射效果

使用:

BlurMaskFilter

new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID)
第一個(gè)參數(shù)代表陰影的半徑值 第二個(gè)參數(shù)代表陰影的樣式

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //繪制原圖
        canvas.drawBitmap(bitmap,50,50,null);
        
        paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID));
        canvas.drawBitmap(bitmap,50,bitmap.getHeight()+100,paint);
        }

注意:使用paint.setMaskFilter()需要將硬件加速關(guān)閉 一般在自定義View的構(gòu)造方法調(diào)用就行了 setLayerType(View.LAYER_TYPE_SOFTWARE,null);

效果:

上面那張圖是沒(méi)做任何處理的,下面使用了 paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.SOLID)); 給人的感覺(jué)就是圖片浮起來(lái)一樣 下面詳細(xì)介紹BlurMaskFilter.Blur 中的幾個(gè)常量的作用

  • BlurMaskFilter.Blur.SOLID

    圖像邊界外產(chǎn)生一層與圖像顏色一致陰影效果,不影響圖像的本身 通過(guò)上面的圖也看到了 換一張色彩豐富的圖再看看 感覺(jué)就不太對(duì)勁了陰影變成五顏六色的了 怎么解決
    后面再說(shuō)

  • BlurMaskFilter.Blur.NORMAL
    整個(gè)圖像都被模糊掉

  • BlurMaskFilter.Blur.OUTER

    圖像邊界外產(chǎn)生一層陰影,并且將圖像變成透明效果


  • BlurMaskFilter.Blur.INNER
    在圖像內(nèi)部邊沿產(chǎn)生模糊效果

解決彩色圖片陰影問(wèn)題

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //獲取圖片的色彩通道
        Bitmap bg_bimap=bitmap1.extractAlpha();
        //設(shè)置畫(huà)筆為我們想要的顏色
        paint.setColor(Color.DKGRAY);
        //樣式采用 NORMAL 或者 SOLID
        paint.setMaskFilter(new BlurMaskFilter(50,BlurMaskFilter.Blur.NORMAL));
        //先畫(huà)背景圖片
        canvas.drawBitmap(bg_bimap,50,50,paint);
        //再畫(huà)我們的前景圖片
        canvas.drawBitmap(bitmap1,50,50,null);
        }

EmbossMaskFilter的使用:
這個(gè)API 使用的場(chǎng)景較少 就簡(jiǎn)單介紹下吧

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        RectF rectF=new RectF(200,200,500,500);
        /**
         * Create an emboss maskfilter
         *
         * @param direction  指定光源的位置,長(zhǎng)度為xxx的數(shù)組標(biāo)量[x,y,z]
         * @param ambient    環(huán)境光的因子 (0~1),越接近0,環(huán)境光越暗
         * @param specular   鏡面反射系數(shù) 越接近0,鏡面反射越強(qiáng)
         * @param blurRadius 模糊半徑 值越大,模糊效果越明顯
         */
        paint.setMaskFilter(new EmbossMaskFilter(new float[]{1,1,1},0.3f,60,80));
        canvas.drawRect(rectF,paint);
    }
        

這個(gè)類(lèi)似浮雕的效果 至于使用場(chǎng)景需要自己去想象發(fā)揮了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容