EmbossMaskFilter BlurMaskFilter 学习

简介: MaskFilter类可以为Paint分配边缘效果。对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter: BlurMaskFilter 指定了一个模糊的样式和半径来处理Paint的边缘,让目标部分模糊不清。

 

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); }

效果图:

相关文章
|
前端开发 数据可视化 Java
Android用Canvas画一个折线图,并加以简单封装
本文介绍了如何用Java绘制动态折线图,从固定折线图的实现到封装成可复用的组件。首先通过绘制XY坐标轴、添加坐标标签和绘制折线及数据点完成基础折线图。接着,将静态数据替换为动态输入,支持自定义X轴、Y轴和折线数据。代码中包含关键方法如`drawDaxes`(绘制坐标轴)、`drawAxispoint`(绘制坐标点)和`drawbrokenLine`(绘制折线)。最终实现可根据传入数据动态生成折线图,适用于Android开发中的数据可视化场景。
447 0
|
存储 API Android开发
getExternalFilesDir到底是什么
getExternalFilesDir对应的目录是/sdcard/Android/data/包名/files/... 可以看到它主要是用来存放应用私有的一些文件。这个目录有几个特性:
2215 0
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
不用涉及到各种冲突常规打造酷炫下拉视差效果SmartRefreshLayout+ViewPager+RecyclerView
670 0
|
5月前
|
机器学习/深度学习 编解码 人工智能
从 Genie 2 到 Genie 3:一年间世界模型发生了什么
2024–2026年,Google DeepMind的Genie系列从2D概念验证(Genie 1)跃升至3D可交互世界(Genie 2),再进化为支持自然语言事件调控、多模态输入与分钟级记忆的Genie 3;2026年1月以Project Genie正式商用,标志世界模型迈入实用化新阶段。
520 2
|
机器学习/深度学习 人工智能 算法
Stable Virtual Camera:2D秒变3D电影!Stability AI黑科技解锁无限运镜,自定义轨迹一键生成
Stable Virtual Camera 是 Stability AI 推出的 AI 模型,能够将 2D 图像转换为具有真实深度和透视感的 3D 视频,支持自定义相机轨迹和多种动态路径,生成高质量且时间平滑的视频。
1160 0
Stable Virtual Camera:2D秒变3D电影!Stability AI黑科技解锁无限运镜,自定义轨迹一键生成
|
Android开发
Android面试题之Activity的启动模式和flag
Android Activity的四种启动模式:standard(默认,每次启动创建新实例),singleTop(栈顶复用,不走onCreate,调用onNewIntent),singleTask(栈内唯一,清除上方Activity)和singleInstance(单独栈内唯一)。启动模式在AndroidManifest.xml中配置,Intent Flags如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP可实现类似功能。了解这些对于处理Activity栈管理至关重要。
467 0
|
安全 Linux Shell
常见的 Linux 命令大全(表格形式)
常见的 Linux 命令大全(表格形式)
1163 1
|
Java API Android开发
19. 【Android教程】进度条 ProgressBar
19. 【Android教程】进度条 ProgressBar
1268 4
|
SQL 算法 关系型数据库
MySQL参数优化之join_buffer_size
MySQL参数优化之join_buffer_size
908 0
MySQL参数优化之join_buffer_size
|
分布式计算 资源调度 NoSQL