美文网首页
android tint着色学习过程

android tint着色学习过程

作者: jackzhous | 来源:发表于2016-06-19 16:35 被阅读121次

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

    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着色学习过程

          本文链接:https://www.haomeiwen.com/subject/pneydttx.html