diff --git a/shimmerlayout/src/main/java/io/supercharge/shimmerlayout/ShimmerLayout.java b/shimmerlayout/src/main/java/io/supercharge/shimmerlayout/ShimmerLayout.java index 5dd6b63..e68a811 100644 --- a/shimmerlayout/src/main/java/io/supercharge/shimmerlayout/ShimmerLayout.java +++ b/shimmerlayout/src/main/java/io/supercharge/shimmerlayout/ShimmerLayout.java @@ -92,6 +92,14 @@ public ShimmerLayout(Context context, AttributeSet attrs, int defStyle) { } } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + if (changed) { + updateShimmerAnimation(); + } + } + @Override protected void onDetachedFromWindow() { resetShimmering(); @@ -124,7 +132,7 @@ public void startShimmerAnimation() { return; } - if (getWidth() == 0) { + if (getWidth() == 0 || isLayoutRequested()) { startAnimationPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { @@ -140,7 +148,35 @@ public boolean onPreDraw() { return; } - Animator animator = getShimmerAnimation(); + Animator animator = getShimmerAnimation(0); + animator.start(); + isAnimationStarted = true; + } + + private void updateShimmerAnimation() { + if (!isAnimationStarted) { + return; + } + long currentPlayTime = maskAnimator.getCurrentPlayTime(); + + if (getWidth() == 0 || isLayoutRequested()) { + startAnimationPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + getViewTreeObserver().removeOnPreDrawListener(this); + updateShimmerAnimation(); + return true; + } + }; + + getViewTreeObserver().addOnPreDrawListener(startAnimationPreDrawListener); + + return; + } + if (maskAnimator != null) { + resetShimmering(); + } + Animator animator = getShimmerAnimation(currentPlayTime); animator.start(); isAnimationStarted = true; } @@ -321,7 +357,7 @@ private void createShimmerPaint() { gradientTexturePaint.setShader(composeShader); } - private Animator getShimmerAnimation() { + private Animator getShimmerAnimation(long currentPlayTime) { if (maskAnimator != null) { return maskAnimator; } @@ -346,6 +382,7 @@ private Animator getShimmerAnimation() { : ValueAnimator.ofInt(0, shimmerAnimationFullLength); maskAnimator.setDuration(shimmerAnimationDuration); maskAnimator.setRepeatCount(ObjectAnimator.INFINITE); + maskAnimator.setCurrentPlayTime(currentPlayTime); maskAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override