android tint着色学习过程

注:本文章是学习过程根据自己的理解总结的,可能存在错误,如有不对还请指正。

tint着色是android 6.0的一个新特性,对我们的资源图片进行着色,使其变成其他颜色的图片资源,减少我们对图片的需求以及apk的大小;着色原理就是对图片中有像素的地方进行颜色填充,已达到不同颜色的图片

1. xml 中使用方式:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/ic_login_username_default"

android:tint="#FFCDD2"

android:id="@+id/image"/>

这样,对一张原始的图片就着色乘FFSDD2颜色的图片

2. 代码中使用

利用DrawableCompat对图片进行颜色渲染,最后将图片设置到对应的组件上即可

ImageViewimage1 = (ImageView)this.findViewById(R.id.image1);

//利用ContextCompat工具累获取draw图片资源

drawable= ContextCompat.getDrawable(this,R.drawable.ic_login_username_default);

//对图片设置着色

DrawableCompat.setTint(drawable,ContextCompat.getColor(this,R.color.pink));

image1.setImageDrawable(drawable);

方法2和方法1最终显示的图片效果是一样的。

3. 不同状态显示不同颜色的图片

利用selector会出现不同的bug和效果,不是很稳定,建议用代码实现

代码实现过程,获取图片,对其着色为多张drawable,在组件不同的状态下把对应的drawable设置进去即可;以下代码是对应该EditText左边icon不同状态显示效果的栗子:

drawable= ContextCompat.getDrawable(this,R.drawable.ic_login_username_default);

//对图片设置着色

DrawableCompat.setTint(drawable,ContextCompat.getColor(this,R.color.pink));

editText= (EditText)this.findViewById(R.id.ed);

editText.setOnFocusChangeListener(newView.OnFocusChangeListener() {

@Override

public voidonFocusChange(View view, booleanb) {

if(b) {

editText.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.ic_login_username_default),null,null,null);

}else{

editText.setCompoundDrawablesWithIntrinsicBounds(drawable,null,null,null);

}

}

});

当然,还有另外的方法解决这种不同状态显示的问题,创建颜色列表数组ColorStateList,在设置到图片里面去:

int[] colors =new int[]{ContextCompat.getColor(this,R.color.colorPrimary),ContextCompat.getColor(this,R.color.pink)};

int[][] states =new int[2][];

states[0] =new int[]{android.R.attr.state_pressed};

states[1] =new int[]{};

ColorStateList coloList =newColorStateList(states,colors);

DrawableCompat.setTintList(drawable1, coloList);

这种状态照理说拿到EditText里面去也是行得通的,但是我试了就是不行,EditText获取焦点时,左边icon只有一个瞬间变色,然后就回复原色,也不知道哪里出问题,反正前一种能够解决就行了

你可能感兴趣的:(android tint着色学习过程)