android半透明图层颜色叠加,Android 图层混合模式PorterDuff.Mode
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相关推荐
- 颜色叠加 java_可绘制Android上的颜色叠加
Drawable background = relativeLayout.getBackground(); background.setColorFilter(getResources().getCo ...
- android按钮背景颜色函数,Android按钮背景颜色(Android button background color)
Android按钮背景颜色(Android button background color) 我想在我的应用程序中设置按钮的背景颜色,我无法实现我想要的结果... 我试图设置的颜色是holo_gree ...
- android html 字体颜色代码,Android TextView通过解析html显示不同颜色和大小
先贴一张效果图 效果 介绍 通过SpannableString.SpannableStringBuilder可以很方便的给TextView加上各种各样的样式,比如不同的颜色和大小,这里就不多说了,具体 ...
- android 图片变颜色代码,Android -对图片Drawable进行变色
Android 图片DrawableCompat利用setTint()对图片Drawable进行变色 1.利用color资源对Drawable变色 Drawable对象的来源不限制,可以是从资源get ...
- android 涂鸦之图片叠加,android图像处理系列之七--图片涂鸦,水印-图片叠加...
图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...
- android timepicker分割线颜色,关于Android的TimePicker和DatePicker一些简单的使用问题
前几天有个需求需要实现这样的一个时间选择器.我没有用"基友"网站上的WheelView 我直接用的是Android系统提供的组件TimePicker和DatePicker. 需求图 ...
- android提取图片颜色代码,Android 中动态提取图片中颜色作为主题色
功能需求 一个页面中顶部显示一张图片(图片从网络加载),此时需要根据图片的颜色来动态调整顶部标题栏的背景色. 技术要求 Android 调色板支持库 实现过程 1.添加调色板支持库 dependenc ...
- android 获取手机颜色代码,Android获取当前主题的颜色属性
安卓代码中获取当前主题颜色方法的两种方法: 第一种方法: TypedArray array = getTheme().obtainStyledAttributes(new int[]{ android ...
- android textview 字体颜色设置,Android textview 设置不同的字体大小和颜色
在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...
- android设置背景颜色渐变,Android背景渐变色(shape,gradient)
Android设置背景色可以通过在res/drawable里定义一个xml,如下: android:startColor="#FFF" android:endColor=" ...
最新文章
- 埃森哲是如何系统化做好数据分析?
- HDOJ/HDU 1556 Color the ball(树状数组)
- jquery 统计统计子标签的个数
- HTML的标签元素分类的区别
- 企业网络管理员如何有效封杀QQ
- brctl 命令详解
- java金额小数位,java 数字转大写金额,小数部分太简单略
- Flink sql 写ddl连接kafka
- 矩阵分解——满秩分解
- 第18届中国智能家居主题沙龙在北京成功举办
- debian android编译,android 平台运行debian
- Boss掉落物品问题
- has a default child route. When navigating to this named route 。。。。。报错
- 硬盘挂载 mount 详细步骤及遇到问题“Mount is denied because the NTFS volume is already exclusively opened”
- Linux_rpm安装
- 免费好用的数据可视化软件工具
- 十分透彻:电容去耦原理
- 奢华运动服饰品牌博格纳中国首家精品店北京开业;乐高集团品牌零售业务在华发展跃上新台阶 | 知消...
- AtCoder Beginner Contest 272「A」「B」「C」「D bfs」「E 思维」
- JAVA连接打印机打印小票、产品信息。标签打印机
热门文章
- LPDDR4的训练(training)和校准(calibration)--ZQ校准(Calibration)
- 还想野蛮生长?互联网金融有《意见》了
- 网易云信IMweb版集成实现(PHP直接上码)
- 南京社保详解(绝对有用)
- 【贪心法】黑白连线问题
- python数列_Python斐波拉契数列
- r语言library什么意思_汽车自动挡上的P、R、N、D、S、L和M,都表示什么意思?
- 【知识点和练习题】心田花开:二年级语文汉语拼音补习
- 解决Mac系统更新后,SVN无法使用的问题
- java魂斗罗_魂斗罗java源代码分享