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 | 内部加粗,外部模糊 |
我们写一个范例来试验一下
-
创建一个 空的 Android 项目
cn.twle.android.BlurMaskFilter
-
自定义一个 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); //关闭硬件加速 } }
-
修改
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 | 模糊半径 |
-
复用上面的范例
-
创建另一个自定义 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); //关闭硬件加速 } }
-
修改
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 的特性,使得绘画更加平滑,但是会多消耗一些内存
把硬件加速关了就好,可以在不同级别下打开或者关闭硬件加速,一般是关闭
-
Application :在配置文件的 application 节点添加
android:hardwareAccelerated="true"
-
Activity :在配置文件的 activity 节点添加
android:hardwareAccelerated="false"
-
View :可以获得 View 对象后调用,或者直接在 View 的 onDraw() 方法里设置
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
参考文档
- 官方API文档: BlurMaskFilter
- 官方API文档: EmbossMaskFilter