使用装饰器模式动态设置Drawable的ColorFilter
欢迎各位关注我的新浪微博:微博
转载请标明出处(kifile的博客)
很多时候我们都希望Android控件点击的时候,有按下效果,选中时有选中效果。通常我们都是通过使用selector来生成一个StateListDrawable来实现。
可是这样我们会面临一个问题,如果使用selector的xml文件生成,那么对于不同的状态,我们就会需要不同的图片,才能够实现drawable的动态改变。
可是有时候,我们的按下状态同普通状态之间唯一的区别只是颜色的差异。那么这个时候,我们真的有必要在resources中放入多个颜色不同的图片吗?
或许很多人不会太在意几张图片的空间消耗,但是有时候,放着放着,包体就变大了。为了减小包体,我们真的有必要只放置一张图片,然后设置他在不同状态下的色值。
首先附上我写的一个Drawable装饰器:
package com.kifile.android.drawable;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.StateSet;
/**
* 根据当前状态选择色值过滤器的Drawable.
* <p/>
* 使用{@link #addState(int[], int)} 添加色值.
*
* @author kifile
*/
public class ColorFilterStateListDrawable extends Drawable implements Drawable.Callback {
private Drawable mDrawable;
private StateListState mStateSets;
private int[] mCurrentState;
public ColorFilterStateListDrawable(Drawable drawable) {
if (drawable == null) {
throw new IllegalArgumentException("drawable cannot be null.");
}
mStateSets = new StateListState();
mDrawable = drawable;
mDrawable.setCallback(this);
}