From f82bc244eaefb0b7d7f24357cd694c65fad3b44b Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 11 Mar 2020 05:01:42 +0000 Subject: [PATCH] Add show/hideScrubber to DefaultTimeBar PiperOrigin-RevId: 300249371 --- RELEASENOTES.md | 1 + .../android/exoplayer2/ui/DefaultTimeBar.java | 65 +++++++++++++++---- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 92ef04de73..dacaa8d161 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -87,6 +87,7 @@ * Upgrade Truth dependency from 0.44 to 1.0. * Upgrade to JUnit 4.13-rc-2. * UI + * Add `showScrubber` and `hideScrubber` methods to DefaultTimeBar. * Move logic of prev, next, fast forward and rewind to ControlDispatcher ([#6926](https://github.com/google/ExoPlayer/issues/6926)). * Demo apps: Add diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java index 790a8f770a..b7e96d2484 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/DefaultTimeBar.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer2.ui; +import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; @@ -163,6 +164,9 @@ public class DefaultTimeBar extends View implements TimeBar { private static final int DEFAULT_INCREMENT_COUNT = 20; + private static final float SHOWN_SCRUBBER_SCALE = 1.0f; + private static final float HIDDEN_SCRUBBER_SCALE = 0.0f; + /** * The name of the Android SDK view that most closely resembles this custom view. Used as the * class name for accessibility. @@ -201,6 +205,7 @@ public class DefaultTimeBar extends View implements TimeBar { private int lastCoarseScrubXPosition; private @MonotonicNonNull Rect lastExclusionRectangle; + private ValueAnimator scrubberScalingAnimator; private float scrubberScale; private boolean scrubbing; private long scrubPosition; @@ -326,6 +331,12 @@ public class DefaultTimeBar extends View implements TimeBar { / 2; } scrubberScale = 1.0f; + scrubberScalingAnimator = new ValueAnimator(); + scrubberScalingAnimator.addUpdateListener( + animation -> { + scrubberScale = (float) animation.getAnimatedValue(); + invalidate(seekBounds); + }); duration = C.TIME_UNSET; keyTimeIncrement = C.TIME_UNSET; keyCountIncrement = DEFAULT_INCREMENT_COUNT; @@ -335,6 +346,44 @@ public class DefaultTimeBar extends View implements TimeBar { } } + /** Shows the scrubber handle. */ + public void showScrubber() { + showScrubber(/* showAnimationDurationMs= */ 0); + } + + /** + * Shows the scrubber handle with animation. + * + * @param showAnimationDurationMs The duration for scrubber showing animation. + */ + public void showScrubber(long showAnimationDurationMs) { + if (scrubberScalingAnimator.isStarted()) { + scrubberScalingAnimator.cancel(); + } + scrubberScalingAnimator.setFloatValues(scrubberScale, SHOWN_SCRUBBER_SCALE); + scrubberScalingAnimator.setDuration(showAnimationDurationMs); + scrubberScalingAnimator.start(); + } + + /** Hides the scrubber handle. */ + public void hideScrubber() { + hideScrubber(/* hideAnimationDurationMs= */ 0); + } + + /** + * Hides the scrubber handle with animation. + * + * @param hideAnimationDurationMs The duration for scrubber hiding animation. + */ + public void hideScrubber(long hideAnimationDurationMs) { + if (scrubberScalingAnimator.isStarted()) { + scrubberScalingAnimator.cancel(); + } + scrubberScalingAnimator.setFloatValues(scrubberScale, HIDDEN_SCRUBBER_SCALE); + scrubberScalingAnimator.setDuration(hideAnimationDurationMs); + scrubberScalingAnimator.start(); + } + /** * Sets the color for the portion of the time bar representing media before the playback position. * @@ -356,18 +405,6 @@ public class DefaultTimeBar extends View implements TimeBar { invalidate(seekBounds); } - /** - * Sets the scale factor for the scrubber handle. Scrubber enabled size, scrubber disabled size, - * scrubber dragged size are scaled by the scale factor. If scrubber drawable is set, the scale - * factor isn't applied. - * - * @param scrubberScale The scale factor for the scrubber handle. - */ - public void setScrubberScale(float scrubberScale) { - this.scrubberScale = scrubberScale; - invalidate(seekBounds); - } - /** * Sets the color for the portion of the time bar after the current played position up to the * current buffered position. @@ -829,8 +866,8 @@ public class DefaultTimeBar extends View implements TimeBar { int playheadRadius = (int) ((scrubberSize * scrubberScale) / 2); canvas.drawCircle(playheadX, playheadY, playheadRadius, scrubberPaint); } else { - int scrubberDrawableWidth = scrubberDrawable.getIntrinsicWidth(); - int scrubberDrawableHeight = scrubberDrawable.getIntrinsicHeight(); + int scrubberDrawableWidth = (int) (scrubberDrawable.getIntrinsicWidth() * scrubberScale); + int scrubberDrawableHeight = (int) (scrubberDrawable.getIntrinsicHeight() * scrubberScale); scrubberDrawable.setBounds( playheadX - scrubberDrawableWidth / 2, playheadY - scrubberDrawableHeight / 2,