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.