自訂控制項詳解(六):Paint 畫筆MaskFilter過濾,

來源:互聯網
上載者:User

自訂控制項詳解(六):Paint 畫筆MaskFilter過濾,

 

首先看一個API:setMaskFilter(MaskFilter maskfilter):

設定MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等。

以下有兩個MaskFilter的子類可供選擇:

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

EmbossMaskFilter:指定了光源的方向和環境光線強度來添加浮雕效果。

 

下面用Demo來看效果:

一、BlurMaskFilter(模糊效果)
public class XBlurMaskFilterView extends View {      public XBlurMaskFilterView(Context context) {        super(context);    }    public XBlurMaskFilterView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public XBlurMaskFilterView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onDraw(Canvas canvas) {        BlurMaskFilter bmf = null;        Paint paint=new Paint();        paint.setColor(Color.RED);         //畫筆顏色        paint.setStyle(Paint.Style.FILL);  //畫筆風格        paint.setAntiAlias(true);          //消除鋸齒        paint.setStrokeWidth(4);           //畫筆粗細        paint.setTextSize(60);             //繪製文字大小,單位px        //第一個參數是模糊半徑,第二個參數是模糊的模式        bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.NORMAL);        paint.setMaskFilter(bmf);        canvas.drawText("這是內外模糊的效果", 100, 100, paint);        bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.OUTER);        paint.setMaskFilter(bmf);        canvas.drawText("這是外部模糊的效果", 100, 200, paint);        bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.INNER);        paint.setMaskFilter(bmf);        canvas.drawText("這是內部模糊的效果", 100, 300, paint);        bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.SOLID);        paint.setMaskFilter(bmf);        canvas.drawText("這是內部加粗、外部模糊的效果", 100, 400, paint);        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //關閉硬體加速    }}

 

:

 

看一下核心代碼:

new BlurMaskFilter(4f,BlurMaskFilter.Blur.NORMAL);
兩個參數:1、模糊的半徑2、模糊的類型BlurMaskFilter.Blur.NORMAL:內外模糊BlurMaskFilter.Blur.OUTER:外部模糊BlurMaskFilter.Blur.INNER:內部模糊BlurMaskFilter.Blur.SOLID:內部加粗,外部模糊

 

 

二、EmbossMaskFilter(浮雕效果)

public class XEmbossMaskFilterView extends View {    public XEmbossMaskFilterView(Context context) {        super(context);    }    public XEmbossMaskFilterView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public XEmbossMaskFilterView(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 = 6.0f;      //模糊半徑        EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);        Paint paint = new Paint();        paint.setAntiAlias(true);          //消除鋸齒        paint.setColor(Color.RED);//畫筆顏色        paint.setStyle(Paint.Style.FILL);  //畫筆風格        paint.setTextSize(120);             //繪製文字大小,單位px        paint.setStrokeWidth(14);           //畫筆粗細        paint.setMaskFilter(emboss);        paint.setMaskFilter(emboss);        canvas.drawText("這是浮雕效果~", 50, 100, paint);        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //關閉硬體加速    }}

 

 

 核心代碼:

EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius) 

參數意義:direction:浮點型數組,用於控制x,y,z軸的光源方向ambient:設定環境光線亮度,0到1之間specular:鏡面反射係數blurRadius:模糊半徑

 

注意點:

在使用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);

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.