Android 图层混合模式 PorterDuff.Mode

PorterDuff.Mode它是将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值.

PorterDuff.Mode共有18种

Android 中使用 图层混合模式常见的地方有三种:

组合渲染ComposeShader (详见: Android Paint总结)

画笔: Paint.setXfermode()

颜色过滤器: PorterDuffColorFilter

本文主要简单说下第二种 画笔: Paint.setXfermode()

PorterDuff.Mode

每一个图层混合模式代表一种规则,根据每种规则计算混合之后的透明通道值和颜色值

使用图层混合模式有几个需要注意的点:

图层混合模式仅作用于src源图像

意思是:以下面谷歌的demo中的第一个为例使用的模式为PorterDuff.Mode.CLEAR

,源图像src为矩形图 目标图为圆形图dst,PorterDuff.Mode.CLEAR表示清除所有颜色值和透明通道,我们从效果可以看到,目标图dst只有与源图像src相交的地方才会有影响

禁用硬件加速

原因: 在Android api 14之后,图层混合的有些api是不支持硬件加速的,系统的硬件加速是默认开启的,所以在使用图层混合模式之前,禁用掉硬件加速 ,方式如下:

//禁止硬件加速

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

离屏绘制

原因: 在不采用离屏绘制的情况下,控件的背景会影响图层混合模式的计算结果,导致得到期望之外的效果

我们看下使用/不使用 离屏绘制的区别:

使用离屏绘制.gif

不使用离屏绘制.gif

通过使用离屏绘制(离屏缓冲),把要绘制的内容单独绘制在缓冲层,保证Xfermode的使用不会出现错误的结果

离屏绘制有两种使用方式,一般使用第一种方式就足够了:

Canvas.saveLayer() 可以做短时的离屏绘制,在绘制之前保存 ,绘制之后结束,使用方式如下:

int saveId= canvas.saveLayer(0, 0, width, height, Canvas.ALL_SAVE_FLAG);

canvas.translate(x, y);

canvas.drawBitmap(mDstB, 0, 0, paint);//绘制操作

paint.setXfermode(xfermode);//设置xfermode

canvas.drawBitmap(mSrcB, 0, 0, paint);//绘制操作

paint.setXfermode(null); //用完清除

canvas.restoreToCount(saveId);//图层恢复

View.setLayerType() 直接把整个View都绘制在离屏缓冲中,使用如下:

setLayerType(LAYER_TYPE_HARDWARE,paint);//使用GPU缓冲

setLayerType(LAYER_TYPE_SOFTWARE,paint);//使用一个Bitmap缓冲

Xfermodes.png

看下PorterDuff.Mode各种模式以及代表的意思:

//其中Sa全称为Source alpha表示源图的Alpha通道;Sc全称为Source color表示源图的颜色;Da全称为Destination alpha表示目标图的Alpha通道;Dc全称为Destination color表示目标图的颜色,[...,..]前半部分计算的是结果图像的Alpha通道值,“,”后半部分计算的是结果图像的颜色值。

//效果作用于src源图像区域

private static final Xfermode[] sModes = {

//所绘制不会提交到画布上

new PorterDuffXfermode(PorterDuff.Mode.CLEAR),

//显示上层绘制的图像

new PorterDuffXfermode(PorterDuff.Mode.SRC),

//显示下层绘制图像

new PorterDuffXfermode(PorterDuff.Mode.DST),

//正常绘制显示,上下层绘制叠盖

new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),

//上下层都显示,下层居上显示

new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),

//取两层绘制交集,显示上层

new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),

//取两层绘制交集,显示下层

new PorterDuffXfermode(PorterDuff.Mode.DST_IN),

//取上层绘制非交集部分,交集部分变成透明

new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),

//取下层绘制非交集部分,交集部分变成透明

new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),

//取上层交集部分与下层非交集部分

new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),

//取下层交集部分与上层非交集部分

new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),

//去除两图层交集部分

new PorterDuffXfermode(PorterDuff.Mode.XOR),

//取两图层全部区域,交集部分颜色加深

new PorterDuffXfermode(PorterDuff.Mode.DARKEN),

//取两图层全部区域,交集部分颜色点亮

new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),

//取两图层交集部分,颜色叠加

new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),

//取两图层全部区域,交集部分滤色

new PorterDuffXfermode(PorterDuff.Mode.SCREEN),

//取两图层全部区域,交集部分饱和度相加

new PorterDuffXfermode(PorterDuff.Mode.ADD),

//取两图层全部区域,交集部分叠加

new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)

};

小案例:刮刮卡

android半透明图层颜色叠加,Android 图层混合模式PorterDuff.Mode相关推荐

  1. 颜色叠加 java_可绘制Android上的颜色叠加

    Drawable background = relativeLayout.getBackground(); background.setColorFilter(getResources().getCo ...

  2. android按钮背景颜色函数,Android按钮背景颜色(Android button background color)

    Android按钮背景颜色(Android button background color) 我想在我的应用程序中设置按钮的背景颜色,我无法实现我想要的结果... 我试图设置的颜色是holo_gree ...

  3. android html 字体颜色代码,Android TextView通过解析html显示不同颜色和大小

    先贴一张效果图 效果 介绍 通过SpannableString.SpannableStringBuilder可以很方便的给TextView加上各种各样的样式,比如不同的颜色和大小,这里就不多说了,具体 ...

  4. android 图片变颜色代码,Android -对图片Drawable进行变色

    Android 图片DrawableCompat利用setTint()对图片Drawable进行变色 1.利用color资源对Drawable变色 Drawable对象的来源不限制,可以是从资源get ...

  5. android 涂鸦之图片叠加,android图像处理系列之七--图片涂鸦,水印-图片叠加...

    图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...

  6. android timepicker分割线颜色,关于Android的TimePicker和DatePicker一些简单的使用问题

    前几天有个需求需要实现这样的一个时间选择器.我没有用"基友"网站上的WheelView 我直接用的是Android系统提供的组件TimePicker和DatePicker. 需求图 ...

  7. android提取图片颜色代码,Android 中动态提取图片中颜色作为主题色

    功能需求 一个页面中顶部显示一张图片(图片从网络加载),此时需要根据图片的颜色来动态调整顶部标题栏的背景色. 技术要求 Android 调色板支持库 实现过程 1.添加调色板支持库 dependenc ...

  8. android 获取手机颜色代码,Android获取当前主题的颜色属性

    安卓代码中获取当前主题颜色方法的两种方法: 第一种方法: TypedArray array = getTheme().obtainStyledAttributes(new int[]{ android ...

  9. android textview 字体颜色设置,Android textview 设置不同的字体大小和颜色

    在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...

  10. android设置背景颜色渐变,Android背景渐变色(shape,gradient)

    Android设置背景色可以通过在res/drawable里定义一个xml,如下: android:startColor="#FFF" android:endColor=" ...

最新文章

  1. 埃森哲是如何系统化做好数据分析?
  2. HDOJ/HDU 1556 Color the ball(树状数组)
  3. jquery 统计统计子标签的个数
  4. HTML的标签元素分类的区别
  5. 企业网络管理员如何有效封杀QQ
  6. brctl 命令详解
  7. java金额小数位,java 数字转大写金额,小数部分太简单略
  8. Flink sql 写ddl连接kafka
  9. 矩阵分解——满秩分解
  10. 第18届中国智能家居主题沙龙在北京成功举办
  11. debian android编译,android 平台运行debian
  12. Boss掉落物品问题
  13. has a default child route. When navigating to this named route 。。。。。报错
  14. 硬盘挂载 mount 详细步骤及遇到问题“Mount is denied because the NTFS volume is already exclusively opened”
  15. Linux_rpm安装
  16. 免费好用的数据可视化软件工具
  17. 十分透彻:电容去耦原理
  18. 奢华运动服饰品牌博格纳中国首家精品店北京开业;乐高集团品牌零售业务在华发展跃上新台阶 | 知消...
  19. AtCoder Beginner Contest 272「A」「B」「C」「D bfs」「E 思维」
  20. JAVA连接打印机打印小票、产品信息。标签打印机

热门文章

  1. LPDDR4的训练(training)和校准(calibration)--ZQ校准(Calibration)
  2. 还想野蛮生长?互联网金融有《意见》了
  3. 网易云信IMweb版集成实现(PHP直接上码)
  4. 南京社保详解(绝对有用)
  5. 【贪心法】黑白连线问题
  6. python数列_Python斐波拉契数列
  7. r语言library什么意思_汽车自动挡上的P、R、N、D、S、L和M,都表示什么意思?
  8. 【知识点和练习题】心田花开:二年级语文汉语拼音补习
  9. 解决Mac系统更新后,SVN无法使用的问题
  10. java魂斗罗_魂斗罗java源代码分享