Насыщенность анимированного изображения

Можно ли анимировать насыщенность изображения (например, PNG) с течением времени? Например, от оттенков серого до полного цвета. Плюс, если я могу использовать Интерполятор.

Я видел классы EffectFactory и ColorMatrix, но я не могу комбинировать их с анимацией / переходом.

Например, применяя насыщенность серого на Drawable drawable:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);

ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);

и для полного насыщения позже:

matrix.setSaturation(1);

Для всех, кто интересуется моим полным решением, основанным на ответе Саймона:

final ColorMatrix matrix = new ColorMatrix();
final Drawable drawable = ... ;

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
//   animation.setInterpolator();
animation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        matrix.setSaturation(animation.getAnimatedFraction());
        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
        drawable.setColorFilter(filter);
    }
});
animation.start();

2 ответа

Решение

Это, безусловно, может быть достигнуто с помощью ValueAnimator:

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.addUpdateListener(new AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        matrix.setSaturation(animation.getAnimatedFraction());
    }
});
animation.start();

Вы должны оживить это самостоятельно!

Не должно быть так сложно.

Увидеть ColorMatrix пример в папке демонстраций API.

http://alvinalexander.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/src/com/example/android/apis/graphics/ColorMatrixSample.java.shtml

Вы можете продлить Drawable и увеличьте значение в методе onDraw, а затем установите фильтр соответствующим образом.

Вы получаете анимацию, позвонив invalidate() каждые несколько мс onDraw, Обязательно замедляйте итерации, переводя поток в спящий режим. Thread.sleep(40); для 25 кадров в секунду

Другие вопросы по тегам