Android setMaskFilter

Paint 类有一个这样的方法 setMaskFilter() 可以用不同的 MaskFilter 实现滤镜的效果,如滤化,立体等

setMaskFilter(MaskFilter maskfilter)

MaskFilter

我们一般不会直接使用 MaskFilter,而是使用它的两个子类

类 说明
BlurMaskFilter 使用一个模糊的样式和半径来处理 Paint 的边缘
EmbossMaskFilter 通过指定光源的方向和环境光强度来添加浮雕效果

BlurMaskFilter 模糊效果

BlurMaskFilter(float radius, BlurMaskFilter.Blur style)
参数 说明
radius 指定模糊边缘的半径
style 指定模糊的风格

BlurMaskFilter.Blur 的枚举常量有

值 说明
BlurMaskFilter.Blur.NORMAL 内外模糊
BlurMaskFilter.Blur.OUTER 外部模糊
BlurMaskFilter.Blur.INNER 内部模糊
BlurMaskFilter.Blur.SOLID 内部加粗,外部模糊

我们写一个范例来试验一下

  1. 创建一个 空的 Android 项目 cn.twle.android.BlurMaskFilter

  2. 自定义一个 View 类 BlurMaskFilterView.java

    package cn.twle.android.blurmaskfilter;
    
    import android.content.Context;
    import android.graphics.BlurMaskFilter;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    
    public class BlurMaskFilterView extends View{
    
        private String text = "简单教程,简单编程";
    
        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(text, 100, 100, paint);
            bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.OUTER);
            paint.setMaskFilter(bmf);
            canvas.drawText(text, 100, 200, paint);
            bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.INNER);
            paint.setMaskFilter(bmf);
            canvas.drawText(text, 100, 300, paint);
            bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.SOLID);
            paint.setMaskFilter(bmf);
            canvas.drawText(text, 100, 400, paint);
    
            bmf = new BlurMaskFilter(50f,BlurMaskFilter.Blur.SOLID);
            paint.setMaskFilter(bmf);
            canvas.drawText(text, 100, 500, paint);
    
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //关闭硬件加速
        }
    }
    
  3. 修改 MainActivity.java 设置 setContentView(new MsView(MainActivity.this))

    package cn.twle.android.blurmaskfilter;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new EmbossMaskFilterView(MainActivity.this));
        }
    }
    

EmbossMaskFilter 浮雕效果

通过指定环境光源的方向和环境光强度来添加浮雕效果

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

参数说明

参数 说明
direction 浮点型数组,用于控制 x,y,z 轴的光源方向
ambient 设置环境光亮度,0到1之间
specular 镜面反射系数
blurRadius 模糊半径

  1. 复用上面的范例

  2. 创建另一个自定义 View 类 EmbossMaskFilterView.java

    package cn.twle.android.blurmaskfilter;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.EmbossMaskFilter;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    
    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 = 10.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);
    
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //关闭硬件加速
        }
    }
    
  3. 修改 MainActivity.java 设置 setContentView(new MsView(MainActivity.this))

    package cn.twle.android.blurmaskfilter;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new EmbossMaskFilterView(MainActivity.this));
        }
    }
    

注意事项

如果不关闭硬件加速,那么 MaskFilter 就不会起效果了,这是因为 Android 在 API 14 以上版本都是默认开启硬件加速的,这样充分 利用 GPU 的特性,使得绘画更加平滑,但是会多消耗一些内存

把硬件加速关了就好,可以在不同级别下打开或者关闭硬件加速,一般是关闭

  1. Application :在配置文件的 application 节点添加

    android:hardwareAccelerated="true"
    
  2. Activity :在配置文件的 activity 节点添加

    android:hardwareAccelerated="false"
    
  3. View :可以获得 View 对象后调用,或者直接在 View 的 onDraw() 方法里设置

    view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    

参考文档

  1. 官方API文档: BlurMaskFilter
  2. 官方API文档: EmbossMaskFilter

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

♥   简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.