Skip to content

Instantly share code, notes, and snippets.

@ipcjs
Created January 18, 2016 14:00
Show Gist options
  • Select an option

  • Save ipcjs/76a1af0e615d1aa77518 to your computer and use it in GitHub Desktop.

Select an option

Save ipcjs/76a1af0e615d1aa77518 to your computer and use it in GitHub Desktop.
package android.support.v4.graphics.drawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.DrawableContainer;
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
/**
* 参考support-v4-23.1.1源码, 修复{@link DrawableCompat#wrap(Drawable)}方法在状态改变后不刷新的问题
* <p/>
* Created by JiangSong on 2016/1/18.
* @see <a herf="https://code.google.com/p/android/issues/detail?id=172067">DrawableCompat#setTintList does not work on Lollipop and above</a>
*/
public class DrawableCompatFix {
public static Drawable wrap(Drawable drawable) {
return IMPL.wrap(drawable);
}
public static <T extends Drawable> T unwrap(Drawable drawable) {
if (drawable instanceof DrawableWrapper) {
return (T) ((DrawableWrapper) drawable).getWrappedDrawable();
}
return (T) drawable;
}
interface WrapperImpl {
Drawable wrap(Drawable drawable);
}
static final WrapperImpl IMPL;
static {
final int version = Build.VERSION.SDK_INT;
if (version >= 23) {
IMPL = new ReturnMyselfWrapper();
} else if (version >= 22) {
IMPL = new ReturnMyselfWrapper();
} else if (version >= 21) {
IMPL = new LollipopWrapper();
} else if (version >= 19) {
IMPL = new KitKatWrapper();
} else if (version >= 17) {
IMPL = new HoneycombWrapper();
} else if (version >= 11) {
IMPL = new HoneycombWrapper();
} else {
IMPL = new BaseWrapper();
}
}
private static class ReturnMyselfWrapper implements WrapperImpl {
@Override
public Drawable wrap(Drawable drawable) {
return drawable;
}
}
private static class HoneycombWrapper implements WrapperImpl {
@Override
public Drawable wrap(Drawable drawable) {
if (!(drawable instanceof DrawableWrapperHoneycomb)) {
return new DrawableWrapperHoneycomb(drawable) {
@Override
public boolean setState(int[] stateSet) {
final boolean consume = super.setState(stateSet);
if (consume) {
this.invalidateSelf();
}
return consume;
}
};
}
return drawable;
}
}
private static class BaseWrapper implements WrapperImpl {
@Override
public Drawable wrap(Drawable drawable) {
if (!(drawable instanceof DrawableWrapperDonut)) {
return new DrawableWrapperDonut(drawable) {
@Override
public boolean setState(int[] stateSet) {
final boolean consume = super.setState(stateSet);
if (consume) {
this.invalidateSelf();
}
return consume;
}
};
}
return drawable;
}
}
private static class KitKatWrapper implements WrapperImpl {
@Override
public Drawable wrap(Drawable drawable) {
if (!(drawable instanceof DrawableWrapperKitKat)) {
return new DrawableWrapperKitKat(drawable) {
@Override
public boolean setState(int[] stateSet) {
final boolean consume = super.setState(stateSet);
if (consume) {
this.invalidateSelf();
}
return consume;
}
};
}
return drawable;
}
}
private static class LollipopWrapper implements WrapperImpl {
@Override
public Drawable wrap(Drawable drawable) {
if (drawable instanceof GradientDrawable || drawable instanceof DrawableContainer) {
// GradientDrawable on Lollipop does not support tinting, so we'll use our compatible
// functionality instead. We also do the same for DrawableContainers since they may
// contain GradientDrawable instances.
return new DrawableWrapperLollipop(drawable) {
@Override
public boolean setState(int[] stateSet) {
final boolean consume = super.setState(stateSet);
if (consume) {
this.invalidateSelf();
}
return consume;
}
};
}
return drawable;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment