Насыщенность анимированного изображения
Можно ли анимировать насыщенность изображения (например, 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.
Вы можете продлить Drawable
и увеличьте значение в методе onDraw, а затем установите фильтр соответствующим образом.
Вы получаете анимацию, позвонив invalidate()
каждые несколько мс onDraw
, Обязательно замедляйте итерации, переводя поток в спящий режим. Thread.sleep(40);
для 25 кадров в секунду