MaskFilter类可以为Paint分配边缘效果。
对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter:
- BlurMaskFilter 指定了一个模糊的样式和半径来处理Paint的边缘,让目标部分模糊不清。
- EmbossMaskFilter 指定了光源的方向和环境光强度来添加浮雕效果,是让目标部分有凹凸的水印图案。
要应用一个MaskFilter,可以使用setMaskFilter方法,并传递给它一个MaskFilter对象
BlurMaskFilter.Blur 4个值:
- INNER:在目标内显示面具,从边缘向目标内到离边缘radius宽的地方显示,radius为初始化BlurMaskFilter的一个值
- NORMAL:在目标内外显示面具,从边缘向目标内和目标外到离边缘radius宽的地方,向外显示面具时都会同时显示在目标边缘处获得的颜色。
- OUTER:在目标外显示面具,从边缘向目标外到离边缘radius宽的地方,并且该部分会显示出从目标边缘获得的颜色,不显示目标
- SOLID:在目标外显示面具,从边缘向目标外到离边缘radius宽的地方,并且该部分会显示出从目标边缘获得的颜色,显示目标
BlurMaskFilter:
package com.soyoungboy.customview.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import com.example.customview.R;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class BlurMaskFilterView extends View {
private Paint mPaint;
private Bitmap mBitmap;
private Bitmap mAlphaBmp;
public BlurMaskFilterView(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public BlurMaskFilterView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BlurMaskFilterView(Context context) {
super(context);
init();
}
/**
* 进行初始化操作
*/
private void init() {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
mPaint = new Paint();
mBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
mAlphaBmp = mBitmap.extractAlpha();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 宽度
int width = 200;
// 高度
int height = width * mAlphaBmp.getHeight() / mAlphaBmp.getWidth();
// 绘制红色阴影,首先将画笔设置为红色
mPaint.setColor(Color.RED);
// 就是添加内外发光效果
mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));
// 绘制阴影在矩形框里面 左上角坐标 10,10,右下角坐标width,height
canvas.drawBitmap(mAlphaBmp, null, new Rect(10, 10, width, height),
mPaint);
// 绘制原图像
mPaint.setMaskFilter(null);
canvas.drawBitmap(mBitmap, null, new Rect(0, 0, width, height), mPaint);
}
}
效果图:
![]()
mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.INNER));
效果图:
![]()
mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.OUTER));
效果图:
![]()
mPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.SOLID));
![]()
使用EmbossMaskFilter
修改onDraw()里面方法:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 宽度
int width = 200;
// 高度
int height = width * mAlphaBmp.getHeight() / mAlphaBmp.getWidth();
//设置光源的方向
float[] direction = new float[] { 1, 1, -1 };
// 设置环境光亮度
float light = 1f;
// 选择要应用的反射等级
float specular = 6;
// 向mask应用一定级别的模糊
float blur = 3.5f;
EmbossMaskFilter emboss = new EmbossMaskFilter(direction, light,
specular, blur);
mPaint.setMaskFilter(emboss);
mPaint.setColor(Color.BLUE);
// 绘制阴影在矩形框里面 左上角坐标 10,10,右下角坐标width,height
canvas.drawBitmap(mAlphaBmp, null, new Rect(10, 10, width, height),
mPaint);
}
效果图:
![]()