/* * Copyright (C) 2016 Thomas Robert Altstidl * * 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.tr4android.support.extension.drawable; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.PixelFormat; import android.graphics.drawable.Drawable; import android.support.annotation.ColorInt; import android.support.v4.graphics.ColorUtils; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import com.tr4android.support.extension.animation.AnimationUtils; import com.tr4android.support.extension.animation.ValueAnimatorCompat; /** * A drawable that animates between two color values */ public class ColorTransitionDrawable extends Drawable { private float mColorRatio; private int mColor; private int mColorStart; private int mColorEnd; // Animator private ValueAnimatorCompat mAnimator; private Interpolator mStartInterpolator = new LinearInterpolator(); private Interpolator mReverseInterpolator = mStartInterpolator; public ColorTransitionDrawable(@ColorInt int start, @ColorInt int end) { mColorRatio = 0f; mColor = start; mColorStart = start; mColorEnd = end; // The animator used to animate the transition mAnimator = AnimationUtils.createAnimator(); mAnimator.setUpdateListener(new ValueAnimatorCompat.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimatorCompat animator) { setColorRatio(animator.getAnimatedFloatValue()); } }); } @Override public void draw(Canvas canvas) { canvas.drawColor(mColor); } @Override public void setAlpha(int i) { // non-functional } @Override public void setColorFilter(ColorFilter colorFilter) { // non-functional } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } public float getColorRatio() { return mColorRatio; } public void setColorRatio(float ratio) { mColorRatio = Math.max(0f, Math.min(ratio, 1f)); mColor = ColorUtils.blendARGB(mColorStart, mColorEnd, mColorRatio); invalidateSelf(); } public void startTransition(int duration) { mAnimator.cancel(); mAnimator.setFloatValues(mColorRatio, 1f); mAnimator.setDuration(duration); mAnimator.setInterpolator(mStartInterpolator); mAnimator.start(); } public void reverseTransition(int duration) { mAnimator.cancel(); mAnimator.setFloatValues(mColorRatio, 0f); mAnimator.setDuration(duration); mAnimator.setInterpolator(mReverseInterpolator); mAnimator.start(); } }