Android 运行时改变 Drawable 的填充色[Toast 样式的进阶版]

这两天无聊,整了 Toast的样式库
先贴地址: https://github.com/didikee/UIToast

1. 关于 Toast 样式的修改

参见我上一篇文章:更换 Android 原生 Toast 的样式

2. 运行时改变 Drawable 的填充色

以 Toast的背景为例说明, Toast的背景是一个名为 toast_frame.9.png的 点9 png图,处理完的效果如图:

uitoast-themecolor.png

Toast 的背景已经变为 colorPrimaryDark的颜色.

实现是利用 Android Tint(翻译为: 着色),Android 5.0以上默认支持的,为了兼容,我们使用 Android Support V4 的包中提供了 DrawableCompat类,辅助我们为 Drawable 着色:

public static Drawable tintDrawable(Drawable drawable, ColorStateList colors) {      final Drawable wrappedDrawable = DrawableCompat.wrap(drawable);    DrawableCompat.setTintList(wrappedDrawable, colors);    return wrappedDrawable;}

这样已经能轻易的实现 Drawable的着色了,但是还没完,还有一个很重的知识点要说明.也许你在使用了这个方法后你会发现,你调用系统自带的 Toast.makeToast(...);方法背景也变成了之前的颜色而不是默认的暗黑色.

这是因为 Android 为了优化系统性能,资源 Drawable 只有一份拷贝,你修改了它,等于所有的都修改了.也就是说同一份资源的状态(比如pressed 等)是共享的.不过, Drawable 提供了一个方法 mutate(),来打破这种共享状态,等于就是要告诉系统,我要修改(mutate)这个 Drawable.
当然,Android 系统只是储存了一份 Drawable 的状态值,而非缓存整个 Drawable,所以不必担心性能问题.

实际应用的代码片段如下:

Drawable toastBackgroundDrawable = TintDrawableUtil.tintDrawable(        toastView.getBackground().mutate(),//mutate(),设置为状态不共享,以免影响系统默认的 Toast背景.        ColorStateList.valueOf(toastBackgroundColor));

3. 下面是介绍我写的Toast的库了

包含的功能:

1. 自定义 Toast 字体颜色2. 自定义 Toast 背景颜色3. 自定义 Toast 展示位置(类似 Popupwindow 在某某下方(正下方水平居中)展示)4. 自定义 Toast 进出场动画

以上四种可以混搭,库比较轻量,三个类,但是依赖 v4包,想想v4已经是众多app必备了我就直接用了.如果有必要的话我可以写个不需要 v4包的.
地址: https://github.com/didikee/UIToast

参考资料: Drawable 着色的后向兼容方案
在搜索到这篇文章时我觉得我的不用写了,人家写的比我好,但是为了记录也为了把更好的分享给大家,我还是把这篇文章贴在这里,enjoy~

更多相关文章

  1. Android(安卓)Paint和Color类绘画实例
  2. 设置背景图时防止图片拉伸的解决方法
  3. Android(安卓)颜色渲染(九) PorterDuff及Xfermode详解
  4. android listView滚动时隔行出现黑色分割线
  5. 使用selector修改TextView中字体的颜色
  6. Android(安卓)DatePicker,NumPicker解析(分割线颜色及调整大小)
  7. Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高
  8. 手把手教你打造一个Material Design风格的App(一)
  9. android的样式(style)与主题(theme)

随机推荐

  1. Android的Task和Activity(一)
  2. Android签名文件相关查看和修改
  3. Android(安卓)判断是否能真正上网(避免连
  4. android总结整理----Sqlite
  5. 布局概述之相对布局RelativeLayout
  6. Android 8.0目录介绍
  7. #Android源代码#android:onClick属性的底
  8. Android(安卓)AIDL实现跨进程Activity与S
  9. SmartImageView初接触
  10. Android实现退出时关闭所有Activity的方