主要原理

PorterDuffColorFilter(int color, PorterDuff.Mode mode)

这个构造方法也接受两个值,一个是16进制表示的颜色值这个很好理解,而另一个是PorterDuff内部类Mode中的一个常量值,这个值表示混合模式。

PorterDuffColorFilter是ColorFilter的一个子类:

ColorFilter是对Drawable设置一个色彩过滤器。这是一个抽象类不能直接使用,他有三个子类:ColorMatrixColorFilter, LightingColorFilter, PorterDuffColorFilter 。

  • ColorMatrixColorFilter 一个通过4*5的颜色矩阵来改变颜色的颜色过滤器;
  • LightingColorFilter 一个可以模拟简单的灯光效果的颜色过滤器;
  • PorterDuffColorFilter 一个可以使用单个颜色和指定Porter-Duff模式来对源像素进行染色颜色过滤器;

使用方法

PorterDuffColorFilter(int color, PorterDuff.Mode mode) 构造器需要两个参数:

  • color即我们需要渲染的颜色;
  • mode即指定的指定Porter-Duff模式,如下图所示:

代码如下:

Bitmap transformBitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap resBitmap = Bitmap.createBitmap(transformBitmap.getWidth(), transformBitmap.getHeight(), transformBitmap.getConfig());
Canvas canvas = new Canvas(resBitmap);
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(mColor, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(transformBitmap, 0.0F, 0.0F, paint);
return resBitmap;       

此外,android为我们提供了一个DrawableCompat类,通过它,我们可以更方便的对Drawable进行着色:

final Drawable wrappedDrawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTintList(wrappedDrawable, colors);
//wrappedDrawable.mutate();
return wrappedDrawable;
在Glide中使用(自定义transform):
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffColorFilter;import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;public class SetColorTransformGlide extends BitmapTransformation {private int mColor;private Context contxt;public SetColorTransformGlide(Context context) {super(context);this.contxt=context;}@Overrideprotected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {return transform(toTransform);}public SetColorTransformGlide(Context context, int color) {super(context);this.mColor = color;this.contxt=context;}public void setResourceColor(int resourceColor) {this.mColor = contxt.getResources().getColor(resourceColor);}public void setColor(int color) {this.mColor = color;}public int getWidth(Bitmap toTransform) {return toTransform.getWidth();}public int getHeight(Bitmap toTransform) {return toTransform.getHeight();}public Bitmap transform( Bitmap transformBitmap) {Bitmap resBitmap = Bitmap.createBitmap(transformBitmap);Canvas canvas = new Canvas(resBitmap);Paint paint = new Paint();paint.setColorFilter(new PorterDuffColorFilter(this.mColor, Mode.SRC_IN));canvas.drawBitmap(transformBitmap, 0.0F, 0.0F, paint);return resBitmap;}public String getId() {return "SetColorTransform color" + this.mColor;}
}

android图标着色相关推荐

  1. 解决Eclipse中Android图标不见了

    解决Eclipse中Android图标不见了 最进在做android的时候,发现Eclipse上android图标不见了: 解决办法如下: 点击window ---->Customize  Pe ...

  2. Android图标设计标准和原则

    概述 本文将介绍如何在应用界面的不同部分使用符合Android 2.x系统风格的图标.遵守这些原则可以使应用程序为用户创造一个流畅统一的操作环境,而一个统一的外观,完整的用户界面会增加产品的附加价值, ...

  3. android图标的制作

    android的adt提供了android图标的制作:Android icon set. 通过这个可以新建一个图标. 1.首先,在Eclipse中某个android项目上右击打开 New - Othe ...

  4. Android 图片着色 Tint 详解2—xml设置、selector

    上篇文章介绍了给drawable设置tint 以达到颜色变化效果,这篇介绍下通过xml设置tint.代码设置tint以及如何设置tint selector. 在xml中设置tint 可以利用 andr ...

  5. QT For Android 图标制作

    QT For Android 图标制作 1.打开一个工程点击项目,项目的构建需要选择Android for xxx(根据个人的需求来构建). 2.构建完成后点击项目==>点击Build==> ...

  6. 【译文】利用Palette为android应用着色

    利用Palette为android应用着色 原文地址:Coloring Android Apps with Palette 材料设计中定义特征的方式之一就是利用颜色在屏幕上强调内容.通过使用Palet ...

  7. Android Tint着色器

    文章目录 Android Tint着色器 概述 使用 XML中使用 代码中使用 选择器使用 tintMode详解 Android Tint着色器 概述 tint 译为着色.tint一般与tintMod ...

  8. Android图标上显示数字

    Android图标上显示数字或加上数字的功能,直到Android4.4也没有实现.所以要修改系统的应用launcher来实现该效果. 之前你可能要参考其他一些博客或资料,对launcher的架构有一个 ...

  9. android 图标的格式,Android Design

    图标就是一个表示屏幕内容并为操作.状态和应用提供第一印象的小幅图片. 在为应用设计图标时,需要牢记设备是多种多样的,这就带来了不同的像素密度(详见 设备与显示 ).为了应对这一问题,提供不同尺寸的图标 ...

最新文章

  1. 工业互联网 — Overview
  2. 谷歌地球API开发者指南(高级)
  3. ns3入门案例1 first.cc
  4. [20161128]关于Little Enddian.txt
  5. 优酷响应式在消费场景的落地之 iOS 篇
  6. Android工程中添加图片资源
  7. qtablewidget 添加一行
  8. 猿类必备:Zeplin 用法介绍
  9. iis服务器响应缓慢,IIS网站加载缓慢怎么办?如何处理?
  10. 我的世界 为何用java开发?
  11. 家谱二叉树c语言程序,家谱图-二叉树
  12. 红皮书——红色启示录
  13. java.io.IOException: FIS_AUTH_ERROR in Android Firebase
  14. #1163 : 博弈游戏·Nim游戏(数学博弈)
  15. Picker 选择器
  16. C++行为型模式-实现观察者模式
  17. DRV8814PWPR
  18. Supermap iDesktop处理导入CAD文件存在线型风格显示缺失问题
  19. LeetCode236.最近的公共祖先
  20. 大写金额用计算机简单些,Excel如何将较小的金额转换为大写金额?

热门文章

  1. 用html让屏幕全黑,这段让网页背景变成纯黑色的浏览器插件如何优化?
  2. C语言编程>第五周 ⑤ 编写一个程序,从键盘输入X,Y,Z 3个数, 编写函数计算3个数的立方和并返回计算结果。
  3. Overleaf中无法使用Grammarly检查语法的问题
  4. STM32F103+ESP8266接入阿里云平台(曲折的上云之路)
  5. 长安马自达2三厢劲翔上市 售8.68-11.58万元
  6. S7-1200与HIKVISION相机TCP通讯
  7. poi导出excel,数据相同时自动居中合并
  8. 编译可执行文件到ARM平台
  9. (附源码)springboot高校党建信息管理系统 毕业设计 051541
  10. HaaS EDU场景式应用学习 - 首页信息屏