注:本文章是学习过程根据自己的理解总结的,可能存在错误,如有不对还请指正。
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只有一个瞬间变色,然后就回复原色,也不知道哪里出问题,反正前一种能够解决就行了