/* * Copyright (c) Gustavo Claramunt (AnderWeb) 2014. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.marshalchen.common.uimodule.discreteseekbar.internal.drawable; import android.content.res.ColorStateList; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; /** * A drawable that changes it's Paint color depending on the Drawable State * <p> * Subclasses should implement {@link #doDraw(android.graphics.Canvas, android.graphics.Paint)} * </p> * * @hide */ public abstract class StateDrawable extends Drawable { private final ColorStateList mTintStateList; private final Paint mPaint; private int mCurrentColor; private int mAlpha = 255; public StateDrawable(@NonNull ColorStateList tintStateList) { super(); mTintStateList = tintStateList; mCurrentColor = tintStateList.getDefaultColor(); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); } @Override public boolean isStateful() { return (mTintStateList.isStateful()) || super.isStateful(); } @Override public boolean setState(int[] stateSet) { boolean handled = super.setState(stateSet); handled = updateTint(stateSet) || handled; return handled; } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } private boolean updateTint(int[] state) { final int color = mTintStateList.getColorForState(state, mCurrentColor); if (color != mCurrentColor) { mCurrentColor = color; //We've changed states invalidateSelf(); return true; } return false; } @Override public void draw(Canvas canvas) { mPaint.setColor(mCurrentColor); int alpha = modulateAlpha(Color.alpha(mCurrentColor)); mPaint.setAlpha(alpha); doDraw(canvas, mPaint); } /** * Subclasses should implement this method to do the actual drawing * * @param canvas The current {@link android.graphics.Canvas} to draw into * @param paint The {@link android.graphics.Paint} preconfigurred with the current * {@link android.content.res.ColorStateList} color */ abstract void doDraw(Canvas canvas, Paint paint); @Override public void setAlpha(int alpha) { mAlpha = alpha; invalidateSelf(); } int modulateAlpha(int alpha) { int scale = mAlpha + (mAlpha >> 7); return alpha * scale >> 8; } @Override public int getAlpha() { return mAlpha; } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } }