为Drawable着色

图片描述

一篇关于如何为drawable和bitmap着色以匹配当前主题的短文。html

在设计Ready主题部分的时候,咱们想到了一个不只能够改变app基本色彩,还能够改变图标和drawable色彩的方法。若是使用一般的作法,意味着为每一种颜色建立一个png,而后基于选择的主题在它们之间切换 - 代码冗长,还增长了apk的大小。咱们还想在从此可以轻易的增长颜色,而不须要每次都建立新的资源文件。android

DrawableCompat

谷歌在v4 support library中引入了DrawableCompat 类,让Lollipop之前的设备有了着色的功能。它的api很全,甚至支持列表的着色与RTL(右到左)布局的倒影,可是对咱们的用例来讲有点重量级了,并且你还必须把当前的Drawable用wrap()包裹。canvas

TintedBitmapDrawable介绍

因此咱们想到了本身的解决办法,一个轻量级的BitmapDrawable子类:TintedBitmapDrawable,它重写了draw() 方法,实用aLightingColorFilter来处理着色的问题。它只包含三个函数,所以不用担忧会增长太多方法个数。颜色能够在额外增长的两个构造函数中指定,也能够经过setTint()方法。api

public final class TintedBitmapDrawable extends BitmapDrawable {
  private int tint;
  private int alpha;
 
  public TintedBitmapDrawable(final Resources res, final Bitmap bitmap, final int tint) {
    super(res, bitmap);
    this.tint = tint;
    this.alpha = Color.alpha(tint);
  }
 
  public TintedBitmapDrawable(final Resources res, final int resId, final int tint) {
    super(res, BitmapFactory.decodeResource(res, resId));
    this.tint = tint;
    this.alpha = Color.alpha(tint);
  }
 
  public void setTint(final int tint) {
    this.tint = tint;
    this.alpha = Color.alpha(tint);
  }
 
  @Override public void draw(final Canvas canvas) {
    final Paint paint = getPaint();
    if (paint.getColorFilter() == null) {
      paint.setColorFilter(new LightingColorFilter(tint, 0));
      paint.setAlpha(alpha);
    }
    super.draw(canvas);
  }
}

如何使用:缓存

tintedDrawable = new TintedBitmapDrawable(resources, R.drawable.ic_arrow_back_white_24dp, Color.GREEN);

优势和提示app

  • 对白色和透明图片有效。ide

  • 须要支持多个主题的时候,无需为同一图标准备多个drawable,减少了apk占用的空间。函数

  • 与谷歌的material图标集完美搭配,只需下载白的的 .png 而后相应着色。布局

  • 也完美适用于 Palette library.this

  • 若是和list的item使用,请缓存drawable.

  • 若是是代码编写的而不是使用menu.xml,也一样可使用在ToolBar上. 。

  • 能够用它来建立一个StateListDrawable,不一样状态下使用同一图标作到不一样颜色,从而减少apk体积。

相关文章
相关标签/搜索