@@ -15,13 +15,15 @@
  */
 import android.animation.Animator;
 import android.animation.AnimatorSet;
+import android.animation.ArgbEvaluator;
 import android.animation.ObjectAnimator;
 import android.animation.TypeEvaluator;
 import android.animation.ValueAnimator;
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
+import android.graphics.Color;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.Xml;
@@ -226,25 +228,53 @@ private static void parseAnimatorFromTypeArray(ValueAnimator anim,
 
         TypeEvaluator evaluator = null;
 
+        boolean hasValueFrom = arrayAnimator.hasValue(R.styleable.Animator_android_valueFrom);
+        boolean hasValueTo = arrayAnimator.hasValue(R.styleable.Animator_android_valueTo);
+
+        /*
+         * Check if animating color by checking if valueFrom or valueTo has a
+         * leading '#' character.
+         */
+        boolean isValueFromColor = false;
+        boolean isValueToColor = false;
+        if (hasValueFrom) {
+            CharSequence text = arrayAnimator.getText(R.styleable.Animator_android_valueFrom);
+            isValueFromColor = text.length() != 0 && text.charAt(0) == '#';
+        }
+        if (hasValueTo) {
+            CharSequence text = arrayAnimator.getText(R.styleable.Animator_android_valueTo);
+            isValueToColor = text.length() != 0 && text.charAt(0) == '#';
+        }
+        boolean isColor = isValueFromColor || isValueToColor;
+        if (isColor) {
+            valueType = VALUE_TYPE_INT;
+        }
+
         if (valueType == VALUE_TYPE_FLOAT) {
-            if (arrayAnimator.hasValue(R.styleable.Animator_android_valueFrom) &&
-                    arrayAnimator.hasValue(R.styleable.Animator_android_valueTo)) {
-                anim.setFloatValues(
-                        arrayAnimator.getFloat(R.styleable.Animator_android_valueFrom, 0),
-                        arrayAnimator.getFloat(R.styleable.Animator_android_valueTo, 0)
-                );
-            } else if (arrayAnimator.hasValue(R.styleable.Animator_android_valueTo)) {
-                anim.setFloatValues(arrayAnimator.getFloat(R.styleable.Animator_android_valueTo, 0));
+            float valueFrom = arrayAnimator.getFloat(R.styleable.Animator_android_valueFrom, 0);
+            float valueTo = arrayAnimator.getFloat(R.styleable.Animator_android_valueTo, 0);
+
+            if (hasValueFrom && hasValueTo) {
+                anim.setFloatValues(valueFrom, valueTo);
+            } else if (hasValueTo) {
+                anim.setFloatValues(valueTo);
             }
         } else if (valueType == VALUE_TYPE_INT) {
-            if (arrayAnimator.hasValue(R.styleable.Animator_android_valueFrom) &&
-                    arrayAnimator.hasValue(R.styleable.Animator_android_valueTo)) {
-                anim.setIntValues(
-                        arrayAnimator.getInt(R.styleable.Animator_android_valueFrom, 0),
-                        arrayAnimator.getInt(R.styleable.Animator_android_valueTo, 0)
-                );
+            int valueFrom;
+            int valueTo;
+            if (isColor) {
+                valueFrom = arrayAnimator.getColor(R.styleable.Animator_android_valueFrom, Color.BLACK);
+                valueTo = arrayAnimator.getColor(R.styleable.Animator_android_valueTo, Color.BLACK);
+                evaluator = new ArgbEvaluator();
+            } else {
+                valueFrom = arrayAnimator.getInt(R.styleable.Animator_android_valueFrom, 0);
+                valueTo = arrayAnimator.getInt(R.styleable.Animator_android_valueTo, 0);
+            }
+
+            if (hasValueFrom && hasValueTo) {
+                anim.setIntValues(valueFrom, valueTo);
             } else if (arrayAnimator.hasValue(R.styleable.Animator_android_valueTo)) {
-                anim.setIntValues(arrayAnimator.getInt(R.styleable.Animator_android_valueTo, 0));
+                anim.setIntValues(valueTo);
             }
         } else if (valueType == VALUE_TYPE_PATH) {
             evaluator = setupAnimatorForPath(anim, arrayAnimator);