Created
January 18, 2016 14:00
-
-
Save ipcjs/76a1af0e615d1aa77518 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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