From b9e7308895e54e3c50d59eab523b3925cd41e538 Mon Sep 17 00:00:00 2001 From: Volodymyr Galandzij Date: Mon, 22 Aug 2022 21:01:59 +0200 Subject: [PATCH] Enable change of repeat count value and support animator listeners This change allows users of ShimmerFrameLayout to query/change a value of repetitions count and add/remove animator listeners. With these changes users will be able to update a shimmer effect when the current animation (or repetition cycle) is finished. --- .../com/facebook/shimmer/ShimmerDrawable.java | 30 +++++++++++++++++++ .../facebook/shimmer/ShimmerFrameLayout.java | 22 ++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/shimmer/src/main/java/com/facebook/shimmer/ShimmerDrawable.java b/shimmer/src/main/java/com/facebook/shimmer/ShimmerDrawable.java index 81048b5..501843c 100644 --- a/shimmer/src/main/java/com/facebook/shimmer/ShimmerDrawable.java +++ b/shimmer/src/main/java/com/facebook/shimmer/ShimmerDrawable.java @@ -8,6 +8,7 @@ package com.facebook.shimmer; +import android.animation.Animator; import android.animation.ValueAnimator; import android.graphics.Canvas; import android.graphics.ColorFilter; @@ -22,6 +23,7 @@ import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.view.animation.LinearInterpolator; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -171,6 +173,34 @@ public int getOpacity() { : PixelFormat.OPAQUE; } + public void setRepeatCount(int count) { + if (mValueAnimator != null) { + mValueAnimator.setRepeatCount(count); + } + } + + public int getRepeatCount() { + return mValueAnimator != null ? mValueAnimator.getRepeatCount() : 0; + } + + public void addAnimatorListener(Animator.AnimatorListener listener) { + if (mValueAnimator != null) { + mValueAnimator.addListener(listener); + } + } + + public void removeAnimatorListener(Animator.AnimatorListener listener) { + if (mValueAnimator != null) { + mValueAnimator.removeListener(listener); + } + } + + public void removeAllAnimatorListeners() { + if (mValueAnimator != null) { + mValueAnimator.removeAllListeners(); + } + } + private float offset(float start, float end, float percent) { return start + (end - start) * percent; } diff --git a/shimmer/src/main/java/com/facebook/shimmer/ShimmerFrameLayout.java b/shimmer/src/main/java/com/facebook/shimmer/ShimmerFrameLayout.java index cdbfbcd..9b7df32 100644 --- a/shimmer/src/main/java/com/facebook/shimmer/ShimmerFrameLayout.java +++ b/shimmer/src/main/java/com/facebook/shimmer/ShimmerFrameLayout.java @@ -8,6 +8,7 @@ package com.facebook.shimmer; +import android.animation.Animator; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; @@ -201,4 +202,25 @@ public void setStaticAnimationProgress(float value) { public void clearStaticAnimationProgress() { mShimmerDrawable.clearStaticAnimationProgress(); } + + public void addAnimatorListener(Animator.AnimatorListener listener) { + mShimmerDrawable.addAnimatorListener(listener); + } + + public void removeAnimatorListener(Animator.AnimatorListener listener) { + mShimmerDrawable.removeAnimatorListener(listener); + } + + public void removeAllAnimatorListeners() { + mShimmerDrawable.removeAllAnimatorListeners(); + } + + public void setRepeatCount(int count) { + mShimmerDrawable.setRepeatCount(count); + } + + public int getRepeatCount() { + return mShimmerDrawable.getRepeatCount(); + } + }