MaskFilter类可以为Paint分配边缘效果。
对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter:

  1. BlurMaskFilter 指定了一个模糊的样式和半径来处理Paint的边缘,让目标部分模糊不清。
  2. EmbossMaskFilter 指定了光源的方向和环境光强度来添加浮雕效果,是让目标部分有凹凸的水印图案。

要应用一个MaskFilter,可以使用setMaskFilter方法,并传递给它一个MaskFilter对象

BlurMaskFilter.Blur 4个值:

  1. INNER:在目标内显示面具,从边缘向目标内到离边缘radius宽的地方显示,radius为初始化BlurMaskFilter的一个值
  2. NORMAL:在目标内外显示面具,从边缘向目标内和目标外到离边缘radius宽的地方,向外显示面具时都会同时显示在目标边缘处获得的颜色。
  3. OUTER:在目标外显示面具,从边缘向目标外到离边缘radius宽的地方,并且该部分会显示出从目标边缘获得的颜色,不显示目标
  4. 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);
}

效果图:

EmbossMaskFilter BlurMaskFilter 学习的更多相关文章

  1. 【Android】解析Paint类中MaskFilter的使用

    目录结构: contents structure [+] EmbossMaskFilter BlurMaskFilter MaskFilter可以用来指定画笔的边缘效果.如果引用开启硬件加速的话,那么 ...

  2. Android 画笔Paint

    转自 http://wuxiaolong.me/2016/08/20/Paint/ 了解Android Paint,一篇就够.引用Aige<自定义控件其实很简单>系列博客的话“很多时候你压 ...

  3. 学习笔记——Paint 1(MaskFilter)

    对于Paint没有很好的深入的学习过,在工作之余再巩固巩固. 1.Paint的BlurMaskFilter(模糊效果) 自定义一个View继承View 重写里面的onDraw方法.这里直接上代码了: ...

  4. Android(java)学习笔记140:SpannableString类的使用

    我们之前说过了我们想实现在TextView组件之中,可以显示URL.Email等特殊信息,这些信息点击可以实现跳转,真正意义上的超链接 要实现上面的需求就要SpannableString这个类. 因为 ...

  5. Android Framework 学习和需要学习的内容

    1. 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework面存一些资料待有空查看. 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony ...

  6. Android 4.0以上BlurMaskFilter效果无效

    Android MaskFilter的基本使用: MaskFilter类可以为Paint分配边缘效果.        对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换.An ...

  7. Android(java)学习笔记82:利用SpannableString设置复合文本

    1. SpannableString设置复合文本: TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来 ...

  8. android基本控件学习-----TextView

    一.TextView的讲解 <实例一> <?xml version="1.0" encoding="utf-8"?> <Linea ...

  9. Android Framework 学习

    1. 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework面存一些资料待有空查看. 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony ...

随机推荐

  1. Slithice 分布式架构设计

    项目原因: 参与过各种 分布式项目,有 Socket,Remoting,WCF,当然还有最常用的可以跨平台的 WebService. 分布式编码的时间浪费: 但是,无一例外的,开发分布式程序的开发遵循 ...

  2. 自定义ModelValidatorProvider

    MVC数据验证原理及自定义ModelValidatorProvider实现无编译修改验证规则和错误信息 Asp.net MVC中的提供非常简单易用的数据验证解决方案. 通过System.Compone ...

  3. [转]Use the IDA and LLDB explore WebCore C + + class inheritance

    原文:http://www.phonesdevelopers.com/1781016/ The surgery class named PluginWidgetIOS use lldb can get ...

  4. Xml转化为DataTable

    /// <summary> /// XML转换为DataTable /// </summary> /// <param name="fileName" ...

  5. Web前端Require.js

    前言 前段时间粗略的扫过一次require.js,当时没怎么在意,结果昨天看到index里面的代码就傻了,完全不知道从哪开始看啦,所以require与backbone的学习还要加紧才行. 由于前端所占 ...

  6. 采用SOLR进行全文索引的完整解决方案,设计图

  7. zoj 1152 A Mathematical Curiosity

    方法:枚举 做这道题,在第十行的位置WA了很多次,(n || m)不能写成(n + m),m可能是负数,一直没注意到,导致不停的WA....... #include <stdio.h> i ...

  8. android JNI--- 搭建环境(1)

    搭建好我们的ndk开发环境,这部分网上资料一大堆,拿来主义~~~~ 工欲善其事必先利其器 , 下面介绍下 Eclipse SDK NDK Cygwin CDT 集成开发环境的搭建. 1.Android ...

  9. 写给新手的WebAPI实践

    此篇是写给新手的Demo,用于参考和借鉴,用于发散思路.老鸟可以忽略了. 自己经常有这种情况,遇到一个新东西或难题,在了解和解决之前总是说“等搞定了一定要写篇文章记录下来”,但是当掌握了之后,就感觉好 ...

  10. H3 BPM 跨平台表单发起详解

    1.1 目的 为方便技术对接服务,实现流程业务的跨平台对接,给出指引和帮助文档. 2 跨平台以Java为例调用.NET BPM表单流程全过程 2.1 双方系统确定接口协议规则 通信协议:基于soap通 ...