首先看一个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(); //画笔粗细
paint.setTextSize(); //绘制文字大小,单位px
//第一个参数是模糊半径,第二个参数是模糊的模式 bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.NORMAL);
paint.setMaskFilter(bmf);
canvas.drawText("这是内外模糊的效果", , , paint); bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.OUTER);
paint.setMaskFilter(bmf);
canvas.drawText("这是外部模糊的效果", , , paint); bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.INNER);
paint.setMaskFilter(bmf);
canvas.drawText("这是内部模糊的效果", , , paint); bmf = new BlurMaskFilter(4f,BlurMaskFilter.Blur.SOLID);
paint.setMaskFilter(bmf);
canvas.drawText("这是内部加粗、外部模糊的效果", , , paint);
setLayerType(View.LAYER_TYPE_SOFTWARE, null); //关闭硬件加速 }
}

效果图:

看一下核心代码:

new BlurMaskFilter(4f,BlurMaskFilter.Blur.NORMAL);
两个参数:
、模糊的半径
、模糊的类型
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[]{ , , }; // 设置光源的方向
float light = 0.4f; //设置环境光亮度
float specular = ; // 定义镜面反射系数
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(); //绘制文字大小,单位px
paint.setStrokeWidth(); //画笔粗细
paint.setMaskFilter(emboss); paint.setMaskFilter(emboss);
canvas.drawText("这是浮雕效果~", , , 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);

自定义控件详解(六):Paint 画笔MaskFilter过滤的更多相关文章

  1. 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析

    第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...

  2. WindowsPhone自定义控件详解(二) - 模板类库分析

    转自:http://blog.csdn.net/mr_raptor/article/details/7251948 WindowsPhone自定义控件详解(一) - 控件类库分析 上一节主要分析了控件 ...

  3. 自定义控件详解(四):Paint 画笔路径效果

    Paint  画笔 ,即用来绘制图形的"笔" 前面我们知道了Paint的一些基本用法: paint.setAntiAlias(true);//抗锯齿功能 paint.setColo ...

  4. MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken

    前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...

  5. MyBatis 映射文件详解(六)

    MyBatis 配置文件类型 MyBatis配置文件有两种类型,如下: 全局配置文件(如 mybatis-config.xml) Mapper XML 映射文件(如 UserMapper.xml) 上 ...

  6. 自定义控件详解(一):Paint类与Canvas类

    前言: 自定义控件必需的两个类:Paint与Canvas Paint    ---  相当于绘图的"笔" Canvas --- 相当于绘图的"纸" 一.Pain ...

  7. 自定义控件详解(七):drawText()

    比较基础的一个方法.即绘制文本 使用如下: Paint paint = new Paint(); paint.setColor(Color.RED); // 红色字体 paint.setStyle(P ...

  8. 自定义控件详解(二):Path类 相关用法

    Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一.直线路径 1.基本方法 void moveTo (float st ...

  9. Linux 信号详解六(可靠信号与不可靠信号)

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

随机推荐

  1. str() vs repr() in Python

    str() 和 repr() 都是用作一个对象的字符表示. 1 str()的举例: s = 'Hello, Geeks.' print str(s) print str(2.0/11.0) 输出结果: ...

  2. 微信小程序入门(二)

    5.安装微信开发者工具 小程序入口文档 点"小程序开发"-->>"工具-->>再点左边的"下载",进行开发者工具的下载 6.小 ...

  3. sql server 索引阐述系列七 索引填充因子与碎片

    一.概述 索引填充因子作用:提供填充因子选项是为了优化索引数据存储和性能. 当创建或重新生成索引时,填充因子的值可确定每个叶级页上要填充数据的空间百分比,以便在每一页上保留一些剩余存储空间作为以后扩展 ...

  4. 改变input的值不会触发change事件的解决思路

    通常来说,如果我们自己通过 value 改变了 input 元素的值,我们肯定是知道的,但是在某些场景下,页面上有别的逻辑在改变 input 的 value 值,我们可能希望能在这个值发生变化的时候收 ...

  5. leetcode — search-for-a-range

    import java.util.Arrays; /** * Source : https://oj.leetcode.com/problems/search-for-a-range/ * * Cre ...

  6. DRDS SQL 审计与分析——全面洞察 SQL 之利器

    背景 数据库存储着系统的核心数据,其安全方面的问题在传统环境中已经成为泄漏和被篡改的重要根源.而在云端,数据库所面临的威胁被进一步的放大.因此,对云数据库的操作行为尤其是全量 SQL 执行记录的审计日 ...

  7. eclipse中打断点debug无效

    今天在测试的时候,发现在eclipse中打了断点,debug居然无效.结果是因为我无意开启了另一个功能,Run-->Skip All Breakpoints (忽略所有的断点) 快捷键:Ctrl ...

  8. springmvc 项目完整示例09 maven项目创建

    需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...

  9. 纯JS实现加载更多(VUE框架)

    <template> <div class = 'car_list' reft='scrollobx' @scroll='scrollready($event)'> </ ...

  10. YARN集群的mapreduce测试(四)

    将手机用户使用流量的数据进行分组,排序: 测试准备: 首先同步时间,然后master先开启hdfs集群,再开启yarn集群:用jps查看: master上: 先有NameNode.SecondaryN ...