在Android中,ImageView有一个android:tint属性,这个属性可以改变ImageView的图片颜色,主要应用在适量图处,这样,我们就不需要在res文件中存放多张不同颜色的矢量图,可以根据自己的需求来设置相关的Tint属性来达到我们的目的,这样不仅省去了多余图片占据的空间,可以使APP瘦身,同样,在相关布局中的设计也更为明显。tint属性还可以用在selector中,达到选择器的效果。注意:在使用tint实现选择器的时候,需要在src中设置相应的selector(虽然实现的drawable是一样的,但是还是需要都写),还要在tint中使用selector才可达到相应的效果。
But,tint属性在Android5.x以上的版本才可以直接使用,那么在低与5.x版本可以在相关向下兼容的代码中实现。

在布局中简单使用(直接修改图片着色):

"@+id/test_iv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:clickable="true"        android:tint="@color/colorAccent"        android:src="@mipmap/ic_launcher"/>

方便兼容低版本,可以在相关代码中实现:

public void setTint() {    //获得相关的Drawable        Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_launcher);        test_iv.setImageDrawable(drawable);    //获得ConstantState状态        Drawable.ConstantState state = drawable.getConstantState();        Drawable test_drawable = DrawableCompat.wrap((state == null ? drawable : state.newDrawable()).mutate());        test_drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());    //DrawableCompat向下兼容设置tint        DrawableCompat.setTint(test_drawable, ContextCompat.getColor(this, R.color.colorAccent));        test_iv.setImageDrawable(test_drawable);    }

相关选择器实现
在xml中实现:

"@+id/test_iv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:clickable="true"        android:tint="@color/icon"        android:src="@drawable/icon_selector"/>

相关drawable/icon_selector 和color/icon 布局

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

在代码里实现:

public void setTintSelector() {        Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_launcher);        //颜色数组        int colors[] = new int[]{ContextCompat.getColor(this, R.color.colorAccent), ContextCompat.getColor(this, R.color.colorPrimary)};    //状态        int states[][] = new int[2][];        states[0] = new int[]{android.R.attr.state_pressed};        states[1] = new int[]{};    //颜色状态集        ColorStateList colorStateList = new ColorStateList(states, colors);    //状态选择集        StateListDrawable stateListDrawable = new StateListDrawable();        stateListDrawable.addState(states[0], drawable);        stateListDrawable.addState(states[1], drawable);        Drawable.ConstantState state = stateListDrawable.getConstantState();        drawable = DrawableCompat.wrap(state == null ? drawable : state.newDrawable()).mutate();        DrawableCompat.setTintList(drawable, colorStateList);        test_iv.setImageDrawable(drawable);        test_iv.setClickable(true);    }

但是针对与不同的View,我们一般常用的方法是设置其相应的background,So,Android也给我们提供了相应的backgroundTint的属性,举一反三,用法和tint相似。

提供一个通用的设置相关selector和着色的方法,主要是针对不同的View设置background的方式实现的。

import android.app.Activity;import android.content.res.ColorStateList;import android.graphics.drawable.Drawable;import android.graphics.drawable.StateListDrawable;import android.support.v4.content.ContextCompat;import android.support.v4.graphics.drawable.DrawableCompat;import android.view.View;/** * Created by Administrator on 2016/11/23. */public class SelectorUtils {    public static SelectorUtils instance;    public static SelectorUtils newInstance() {        if (instance == null) {            synchronized (SelectorUtils.class) {                if (instance == null) {                    instance = new SelectorUtils();                }            }        }        return instance;    }    /**     * 主要针对的是ImageView设置图片,     * 图片资源为一张,通过tint来修改不同状态时显示的不同背景,     * 以达到节约资源,减少内存的目的     *     * @param activity      当前的Activity或者Fragment     * @param view          需要修改的View,主要只ImageView     * @param drawableRes   drawable资源id     * @param normalColor   正常时的颜色     * @param selectorColor 选中时的颜色     */    public void viewSetSelector(Activity activity, View view, int drawableRes, int normalColor, int selectorColor) {        Drawable drawable = ContextCompat.getDrawable(activity, drawableRes);        //获得选中颜色和非选中颜色        int colors[] = new int[]{ContextCompat.getColor(activity, selectorColor),                ContextCompat.getColor(activity, normalColor)};        //点击状态数组        int states[][] = new int[2][];        //点击状态        states[0] = new int[]{android.R.attr.state_pressed};        //非点击状态        states[1] = new int[]{};        //存放状态值和颜色        ColorStateList colorStateList = new ColorStateList(states, colors);        //存放相应状态和drawable        StateListDrawable stateListDrawable = new StateListDrawable();        stateListDrawable.addState(states[0], drawable);        stateListDrawable.addState(states[1], drawable);        Drawable.ConstantState state = stateListDrawable.getConstantState();        drawable = DrawableCompat.wrap(state == null ? drawable : state.newDrawable()).mutate();        DrawableCompat.setTintList(drawable, colorStateList);        view.setClickable(true);        //改变背景Drawable        view.setBackgroundDrawable(drawable);        //如果是ImageView,可以设置src相关        //view.setImageDrawable(drawable);    }    /**     * 改变View的状态的图示,通过Tint减少资源和内存     *     * @param activity    当前Activity或者Fragment     * @param view        当前需要改变的View     * @param drawableRes 资源id     * @param colorRes    color资源     */    public void changeViewState(Activity activity, View view, int drawableRes, int colorRes) {        Drawable drawable = ContextCompat.getDrawable(activity, drawableRes);        int color = ContextCompat.getColor(activity, colorRes);        Drawable.ConstantState state = drawable.getConstantState();        drawable = DrawableCompat.wrap(state == null ? drawable : state.newDrawable()).mutate();        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());        DrawableCompat.setTint(drawable, color);        view.setBackgroundDrawable(drawable);        //如果是ImageView,可以设置src相关        //view.setImageDrawable(drawable);    }

更多相关文章

  1. 利用BeautifulSoup的find_all()函数查找某个标签且该标签某属性
  2. Android—— Android 的属性系统
  3. Android状态栏提醒(Notification,NotificationManager)的使用!
  4. Android 滑动改变标题/栏导航栏颜色、透明度

随机推荐

  1. <转>android 中px,sp等的区别
  2. 重定向android log
  3. android多进程及AIDL简单使用
  4. android 中使用TextView实现分段显示不同
  5. android surfaceflinger研究
  6. 【Android volley】Android库Volley的使
  7. Android Q 电量使用图分析 show app usag
  8. 【startActivityForResult】Android Acti
  9. [android源码下载索引贴】微信+二维码那
  10. Android中OpenMax的适配层