如何为drawable着色

泡在网上的日子 / 文 发表于2015-08-24 10:16 次阅读

blob.png

英文原文:Tinting drawables 


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

在设计Ready主题部分的时候,我们想到了一个不仅可以改变app基本色彩,还可以改变图标和drawable色彩的方法。如果使用通常的做法,意味着为每一种颜色创建一个png,然后基于选择的主题在它们之间切换 - 代码冗长,还增加了apk的大小。我们还想在今后能够轻易的增加颜色,而不需要每次都创建新的资源文件。

DrawableCompat

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

TintedBitmapDrawable介绍

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

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

优点和提示

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

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

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

  • 也完美适用于 Palette library.

  • 如果和list的item使用,请缓存drawable.

  • 如果是代码编写的而不是使用menu.xml,也同样可以使用在ToolBar上. 。

  • 可以用它来创建一个StateListDrawable,不同状态下使用同一图标做到不同颜色,从而减小apk体积。


收藏 赞 (18) 踩 (0)
上一篇:Android OkHttp完全解析 是时候来了解OkHttp了
一、概述 最近在群里听到各种讨论okhttp的话题,可见okhttp的口碑相当好了。再加上Google貌似在6.0版本里面删除了HttpClient相关API,对于这个行为不做评价。为了更好的在应对网络访问,学习下okhttp还是蛮必要的,本篇博客首先介绍okhttp的简单使用,主要包
下一篇:Android实现炫酷SVG动画效果
原文出处: http://blog.csdn.net/crazy__chen/article/details/47728241 svg是目前十分流行的图像文件格式了,svg严格来说应该是一种开放标准的矢量图形语言,使用svg格式我们可以直接用代码来描绘图像,可以用任何文字处理工具打开svg图像,通过改变部分代