上篇文章介绍了给drawable设置tint 以达到颜色变化效果,这篇介绍下通过xml设置tint、代码设置tint以及如何设置tint selector。

在xml中设置tint

可以利用 android:tint 以及 android:tintMode 属性设置布局中的着色颜色和模式。而对背景进行着色可以通过设置 android:backgroundTint 属性,但是需要注意几点:

  1. 在布局中设置android:backgroundTint 属性首先要设置 android:background 属性,否则会无效;
  2. android:backgroundTint 属性需要最小支持的api为21,所以为了兼容api版本低于21的情况,需要使用 app:backgroundTint,命名空间为xmlns:app=”http://schemas.android.com/apk/res-auto”

Code设置tint

ImageView 中有 setImageTintList 方法,可用于给 drawable 进行着色,但是同样得先设置过drawable才会生效,而且限制api 版本最低是21。另外可以给background 设置着色,view.setBackgroundTintList 同样限制api版本最低支持21。

ColorStateList colorStateList = ColorStateList.valueOf(Color.parseColor("#5a8386"));
// 需要先设置background才会生效
mBtn.setBackgroundTintList(colorStateList);// 需要先设置image(drawable)才会生效
mImageView.setImageTintList(colorStateList);

在api < 21 时,可以使用兼容包中的控件 AppCompatEditText、AppCompatTextView、AppCompatButton等

mCompatBtn.setSupportBackgroundTintList(colorStateList);

另外可以通过给drawable 设置着色,然后设置图片或者背景 也可实现着色效果。本篇不重点介绍了,有意向可前往上一篇文章的详细讲解,梯子已经备好!

http://blog.csdn.net/jm_beizi/article/details/54916965 Android 图片着色 Tint 详解

简单示例:

Drawable bmpDrawable = ContextCompat.getDrawable(this, R.drawable.icon_beijing);Drawable.ConstantState state = bmpDrawable.getConstantState();
// 对drawable 进行重新实例化、包装、可变操作
Drawable wrap = DrawableCompat.wrap(state == null ? bmpDrawable : state.newDrawable()).mutate();
// 进行着色 setTint和setTintList 方法都可以进行着色
DrawableCompat.setTint(wrap, Color.parseColor("#5a8386"));
//DrawableCompat.setTintList(wrap, colorStateList);mImageView1.setImageDrawable(wrap);
//mImageView1.setBackground(wrap);
原图
ImageView 背景着色
Button背景着色
AppCompatButton背景着色

Selector Tint

在res/color 文件下创建一个颜色选择器
eg:
selector_color_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="#ff4081" android:state_pressed="true" /> <!-- pressed --><item android:color="#30c3a6" /> <!-- default -->
</selector>

在res/drawable文件下创建一个图片选择器
selector_drawable_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/icon_beijing" android:state_pressed="true" /><item android:drawable="@drawable/icon_beijing" />
</selector>

code设置selector

非兼容包控件
1、实例化Drawable对象,设置Background

Drawable selectorDrawable = ContextCompat.getDrawable(this, R.drawable.selector_drawable_button);
mImageView2.setBackground(selectorDrawable);

2、读取颜色选择器文件实例化对象

ColorStateList colorStateList = ContextCompat.getColorStateList(this, R.color.selector_color_button);

3、设置tintList

// 这里做个版本兼容,如果api 版本>21,就使用系统提供的setBackgroundTintList方法来进行着色;如果api版本不高于21,就
// 使用设置drawable的方式进行着色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {mImageView2.setBackgroundTintList(colorStateListSelector);} else {          mImageView2.setBackground(SkxDrawableHelper.tintListDrawable(mImageView2.getBackground(), colorStateListSelector));
}

4、如果是ImageView 需要设置 setClickable(true) 或者android:clickable=“true”,否则还是不会实现selector 效果。

兼容包控件
如果是兼容包里的控件如 AppCompatButton,直接用兼容控件里的着色方法就可以。而且drawable的设置直接选用图片就可以,不需要用 selector drawable

 Drawable bgDrawable = ContextCompat.getDrawable(this, R.drawable.icon_beijing);mCompatBtn4.setBackground(bgDrawable);mCompatBtn4.setSupportBackgroundTintList(colorStateListSelector);

xml设置selector

和code设置一样,有几个关键点。background、backgroundTint

1、设置Background 属性,注意这里是用的图片选择器,而不是一个单独的图片。另外即使用的是 AppCompatButton之类的兼容类属性值也需要设置成selector 而不是drawable。

  android:background="@drawable/selector_drawable_button"

2、设置背景着色,即backgroundTint属性,如果需要兼容5.0以下版本时需要使用命名空间为 app下的属性,此处应是颜色选择器。

app:backgroundTint="@color/selector_color_button"

3、如果是ImageView 需要设置 android:clickable=”true”

效果图:

目标view 效果
ImageView 通过tint设置背景选择器
Button通过tint设置背景选择器
AppCompatButton 通过tint设置背景选择器

关于为什么background 设置BitmapDrawable 不行,而StateListDrawable是ok的 我也没太懂。参考网上的说法感觉还是懵,下面是我列出来的测试的几个情况:

从测试的这几组数据来看,不确定是否跟系统版本有关系。


其实在用 drawable 选择器之前还有一个小插曲,算是我误打误撞的结果。
我上一下示例代码

     <android.support.v7.widget.AppCompatButtonandroid:id="@+id/tintTest2_btn3"android:layout_width="0dp"android:layout_height="70dp"android:layout_weight="1"android:textColor="@color/selector_color_button"android:background="@drawable/icon_beijing"app:backgroundTint="@color/selector_color_button" />

上面代码对应下图左边的这个,这里没有用StateListDrawable,之前给文字设置了个颜色选择器没有删除,运行了下程序,结果替tint selector 是可行的!

Android 图片着色 Tint 详解2—xml设置、selector相关推荐

  1. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  2. ANDROID L——Material Design详解(视图和阴影)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  3. Android应用坐标系统全面详解

    Android应用坐标系统全面详解 原文链接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117 1. 背景 去年有很多人 ...

  4. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  5. 宏锦软件 Android 的 ListView 使用详解

     宏锦软件爱好者在开发Android软件时,对ListView的使用有点陌生,于是翻了许多资料,这里给大家一份比较好的教程,希望有用. 在android开发中ListView是比较常用的组件,它以 ...

  6. Android开发入门一之Android应用程序架构详解

    Android应用程序架构详解如下: src/ java源代码存放目录 gen/自动生成目录 gen 目录中存放所有由Android开发工具自动生成的文件.目录中最重要的就是R.java文件.这个文件 ...

  7. 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶

    本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...

  8. ANDROID L——Material Design详解(动画篇)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  9. Android 换肤方案详解(一)

    引言 在我们的开发中,也许有些项目会有换肤的需求,这个时候会比较头疼怎么做才能做到一键换肤呢?大家肯定是希望只要一行代码就能调用最好.下面我们先分析一下换肤的本质是什么? 原理 换肤,其本质无非就是更 ...

最新文章

  1. 【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!
  2. 超硬核的 Python 数据可视化教程
  3. matlab doc函数,matlab常用函数.doc
  4. Android之上下文菜单创建
  5. php如何定义的数位置,php如何实现不借助IDE快速定位行数或者方法定义的文件和位置...
  6. Python从N个数中找到最大的K个数
  7. 用dl元素编辑html个人信息,html dl dt dd标签元素语法结构与使用
  8. 点击率预测的贝叶斯平滑
  9. 矩阵论第一章总结(思维导图)
  10. STC15单片机-低功耗设计
  11. incaseformat蠕虫病毒样本分析
  12. 淘特淘宝淘金币助手软件,每天自动完成任务领取淘金币
  13. web前端设计与开发期末作品:旅游网站设计——响应式的出国旅游定制(17页) HTML+CSS+JavaScript 旅游网页html 旅游景点html...
  14. 海龟交易法:如何防止模型死亡
  15. Window图片和传真查看器不能用
  16. Android高级开发进阶图谱
  17. php小程序地图处理,微信小程序地图 map
  18. iOS StoreKit 2 新特性解析
  19. html5移动端点击复制,H5实现移动端复制文字功能
  20. 高数 | 多元函数求极限 使用极坐标代换的条件与细节

热门文章

  1. 1 - 基本逻辑门代码设计和仿真
  2. 关于程序员如何提高自己的一些感言
  3. Mastercam 2021安装步骤(附安装教程)
  4. TOM游戏微信营销平台-助力全行业H5营销
  5. 对原data数据进行修改》
  6. 《BIO、NIO、AIO非阻塞通信实例》
  7. 不可链接性(unlinkability)与匿名性(anonymity)
  8. MySQL数据管理(二)
  9. uniapp上下元素联动
  10. pyhton批量化用标题命名文件名踩得坑