Ich habe festgestellt, dass die Implementierung, die von ArgbEvaluator
im Android-Quellcode leistet beste Arbeit beim Übergang von Farben. Wenn ich HSV verwende, springt der Übergang je nach den beiden Farben für mich durch zu viele Farbtöne. Aber bei dieser Methode ist das nicht der Fall.
Wenn Sie einfach nur animieren wollen, verwenden Sie ArgbEvaluator
con ValueAnimator
wie vorgeschlagen aquí :
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
view.setBackgroundColor((int) animator.getAnimatedValue());
}
});
colorAnimation.start();
Wenn es Ihnen jedoch wie mir geht und Sie Ihren Übergang mit einer Benutzergeste oder einem anderen von einer Eingabe übergebenen Wert verknüpfen wollen, können Sie die ValueAnimator
ist nicht sehr hilfreich (es sei denn, Sie zielen auf API 22 und höher ab, in diesem Fall können Sie die ValueAnimator.setCurrentFraction()
Methode). Wenn Sie unterhalb von API 22 zielen, verpacken Sie den Code, der in ArgbEvaluator
Quellcode in Ihrer eigenen Methode, wie unten gezeigt:
public static int interpolateColor(float fraction, int startValue, int endValue) {
int startA = (startValue >> 24) & 0xff;
int startR = (startValue >> 16) & 0xff;
int startG = (startValue >> 8) & 0xff;
int startB = startValue & 0xff;
int endA = (endValue >> 24) & 0xff;
int endR = (endValue >> 16) & 0xff;
int endG = (endValue >> 8) & 0xff;
int endB = endValue & 0xff;
return ((startA + (int) (fraction * (endA - startA))) << 24) |
((startR + (int) (fraction * (endR - startR))) << 16) |
((startG + (int) (fraction * (endG - startG))) << 8) |
((startB + (int) (fraction * (endB - startB))));
}
Und verwenden Sie es, wie Sie wollen.