java.lang.Object
↳androidx.core.view.ViewPropertyAnimatorCompat
Gradle dependencies
compile group: 'androidx.core', name: 'core', version: '1.15.0-alpha02'
- groupId: androidx.core
- artifactId: core
- version: 1.15.0-alpha02
Artifact androidx.core:core:1.15.0-alpha02 it located at Google repository (https://maven.google.com/)
Androidx artifact mapping:
androidx.core:core com.android.support:support-compat
Androidx class mapping:
androidx.core.view.ViewPropertyAnimatorCompat android.support.v4.view.ViewPropertyAnimatorCompat
Summary
| Methods | 
|---|
| public ViewPropertyAnimatorCompat | alpha(float value) 
 This method will cause the View's alphaproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | alphaBy(float value) 
 This method will cause the View's alphaproperty to be animated by the
 specified value. | 
| public void | cancel() 
 Cancels all property animations that are currently running or pending. | 
| public long | getDuration() 
 Returns the current duration of property animations. | 
| public Interpolator | getInterpolator() 
 Returns the timing interpolator that this animation uses. | 
| public long | getStartDelay() 
 Returns the current startDelay of property animations. | 
| public ViewPropertyAnimatorCompat | rotation(float value) 
 This method will cause the View's rotationproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | rotationBy(float value) 
 This method will cause the View's rotationproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | rotationX(float value) 
 This method will cause the View's rotationXproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | rotationXBy(float value) 
 This method will cause the View's rotationXproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | rotationY(float value) 
 This method will cause the View's rotationYproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | rotationYBy(float value) 
 This method will cause the View's rotationYproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | scaleX(float value) 
 This method will cause the View's scaleXproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | scaleXBy(float value) 
 This method will cause the View's scaleXproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | scaleY(float value) 
 This method will cause the View's scaleYproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | scaleYBy(float value) 
 This method will cause the View's scaleYproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | setDuration(long value) 
 Sets the duration for the underlying animator that animates the requested properties. | 
| public ViewPropertyAnimatorCompat | setInterpolator(Interpolator value) 
 Sets the interpolator for the underlying animator that animates the requested properties. | 
| public ViewPropertyAnimatorCompat | setListener(ViewPropertyAnimatorListener listener) 
 Sets a listener for events in the underlying Animators that run the property
 animations. | 
| public ViewPropertyAnimatorCompat | setStartDelay(long value) 
 Sets the startDelay for the underlying animator that animates the requested properties. | 
| public ViewPropertyAnimatorCompat | setUpdateListener(ViewPropertyAnimatorUpdateListener listener) 
 Sets a listener for update events in the underlying Animator that runs
 the property animations. | 
| public void | start() 
 Starts the currently pending property animations immediately. | 
| public ViewPropertyAnimatorCompat | translationX(float value) 
 This method will cause the View's translationXproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | translationXBy(float value) 
 This method will cause the View's translationXproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | translationY(float value) 
 This method will cause the View's translationYproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | translationYBy(float value) 
 This method will cause the View's translationYproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | translationZ(float value) 
 This method will cause the View's translationZproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | translationZBy(float value) 
 This method will cause the View's translationZproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | withEndAction(java.lang.Runnable runnable) 
 Specifies an action to take place when the next animation ends. | 
| public ViewPropertyAnimatorCompat | withLayer() 
 The View associated with this ViewPropertyAnimator will have its
 layer typeset toViewfor the duration of the next animation. | 
| public ViewPropertyAnimatorCompat | withStartAction(java.lang.Runnable runnable) 
 Specifies an action to take place when the next animation runs. | 
| public ViewPropertyAnimatorCompat | x(float value) 
 This method will cause the View's xproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | xBy(float value) 
 This method will cause the View's xproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | y(float value) 
 This method will cause the View's yproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | yBy(float value) 
 This method will cause the View's yproperty to be animated by the
 specified value. | 
| public ViewPropertyAnimatorCompat | z(float value) 
 This method will cause the View's zproperty to be animated to the
 specified value. | 
| public ViewPropertyAnimatorCompat | zBy(float value) 
 This method will cause the View's zproperty to be animated by the
 specified value. | 
| from java.lang.Object | clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | 
Methods
Sets the duration for the underlying animator that animates the requested properties.
 By default, the animator uses the default value for ValueAnimator. Calling this method
 will cause the declared value to be used instead.
Parameters:
value: The length of ensuing property animations, in milliseconds. The value
 cannot be negative.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's alpha property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's alpha property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's translationX property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's translationY property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
Specifies an action to take place when the next animation ends. The action is only
 run if the animation ends normally; if the ViewPropertyAnimator is canceled during
 that animation, the runnable will not run.
 This method, along with ViewPropertyAnimatorCompat.withStartAction(Runnable), is intended to help facilitate
 choreographing ViewPropertyAnimator animations with other animations or actions
 in the application.
 
For example, the following code animates a view to x=200 and then back to 0:
 
     Runnable endAction = new Runnable() {
         public void run() {
             view.animate().x(0);
         }
     };
     view.animate().x(200).withEndAction(endAction);
 
 For API 14 and 15, this method will run by setting
 a listener on the ViewPropertyAnimatorCompat object and running the action
 in that listener's ViewPropertyAnimatorListener.onAnimationEnd(View) method.
Parameters:
runnable: The action to run when the next animation ends.
Returns:
This object, allowing calls to methods in this class to be chained.
public long 
getDuration()
Returns the current duration of property animations. If the duration was set on this
 object, that value is returned. Otherwise, the default value of the underlying Animator
 is returned.
Returns:
The duration of animations, in milliseconds.
See also: ViewPropertyAnimatorCompat.setDuration(long)
Sets the interpolator for the underlying animator that animates the requested properties.
 By default, the animator uses the default interpolator for ValueAnimator. Calling this method
 will cause the declared object to be used instead.
Parameters:
value: The TimeInterpolator to be used for ensuing property animations.
Returns:
This object, allowing calls to methods in this class to be chained.
public Interpolator 
getInterpolator()
Returns the timing interpolator that this animation uses.
Returns:
The timing interpolator for this animation.
Sets the startDelay for the underlying animator that animates the requested properties.
 By default, the animator uses the default value for ValueAnimator. Calling this method
 will cause the declared value to be used instead.
Parameters:
value: The delay of ensuing property animations, in milliseconds. The value
 cannot be negative.
Returns:
This object, allowing calls to methods in this class to be chained.
public long 
getStartDelay()
Returns the current startDelay of property animations. If the startDelay was set on this
 object, that value is returned. Otherwise, the default value of the underlying Animator
 is returned.
Returns:
The startDelay of animations, in milliseconds.
See also: ViewPropertyAnimatorCompat.setStartDelay(long)
This method will cause the View's rotation property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's rotation property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's rotationX property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's rotationX property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's rotationY property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's rotationY property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's scaleX property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's scaleX property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's scaleY property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's scaleY property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
Cancels all property animations that are currently running or pending.
This method will cause the View's x property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's x property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's y property to be animated to the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The value to be animated to.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's y property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's translationX property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's translationY property to be animated by the
 specified value. Animations already running on the property will be canceled.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's translationZ property to be animated by the
 specified value. Animations already running on the property will be canceled.
 
Prior to API 21, this method will do nothing.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's translationZ property to be animated to the
 specified value. Animations already running on the property will be canceled.
 
Prior to API 21, this method will do nothing.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's z property to be animated to the
 specified value. Animations already running on the property will be canceled.
 
Prior to API 21, this method will do nothing.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
This method will cause the View's z property to be animated by the
 specified value. Animations already running on the property will be canceled.
 
Prior to API 21, this method will do nothing.
Parameters:
value: The amount to be animated by, as an offset from the current value.
Returns:
This object, allowing calls to methods in this class to be chained.
Starts the currently pending property animations immediately. Calling start()
 is optional because all animations start automatically at the next opportunity. However,
 if the animations are needed to start immediately and synchronously (not at the time when
 the next event is processed by the hierarchy, which is when the animations would begin
 otherwise), then this method can be used.
The View associated with this ViewPropertyAnimator will have its
 layer type set to
 View for the duration of the next animation.
 As stated in the documentation for View,
 the actual type of layer used internally depends on the runtime situation of the
 view. If the activity and this view are hardware-accelerated, then the layer will be
 accelerated as well. If the activity or the view is not accelerated, then the layer will
 effectively be the same as View.
 
This state is not persistent, either on the View or on this ViewPropertyAnimator: the
 layer type of the View will be restored when the animation ends to what it was when this
 method was called, and this setting on ViewPropertyAnimator is only valid for the next
 animation. Note that calling this method and then independently setting the layer type of
 the View (by a direct call to
 View) will result in some
 inconsistency, including having the layer type restored to its pre-withLayer()
 value when the animation ends.
Returns:
This object, allowing calls to methods in this class to be chained.
See also: View
Specifies an action to take place when the next animation runs. If there is a
 startDelay set on this ViewPropertyAnimator, then the
 action will run after that startDelay expires, when the actual animation begins.
 This method, along with ViewPropertyAnimatorCompat.withEndAction(Runnable), is intended to help facilitate
 choreographing ViewPropertyAnimator animations with other animations or actions
 in the application.
Parameters:
runnable: The action to run when the next animation starts.
Returns:
This object, allowing calls to methods in this class to be chained.
Sets a listener for events in the underlying Animators that run the property
 animations.
Parameters:
listener: The listener to be called with AnimatorListener events. A value of
 null removes any existing listener.
Returns:
This object, allowing calls to methods in this class to be chained.
Sets a listener for update events in the underlying Animator that runs
 the property animations.
Parameters:
listener: The listener to be called with update events. A value of
 null removes any existing listener.
Returns:
This object, allowing calls to methods in this class to be chained.
Source
/*
 * Copyright 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package androidx.core.view;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.graphics.Paint;
import android.os.Build;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.animation.Interpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import java.lang.ref.WeakReference;
public final class ViewPropertyAnimatorCompat {
    private final WeakReference<View> mView;
    ViewPropertyAnimatorCompat(View view) {
        mView = new WeakReference<>(view);
    }
    /**
     * Sets the duration for the underlying animator that animates the requested properties.
     * By default, the animator uses the default value for ValueAnimator. Calling this method
     * will cause the declared value to be used instead.
     *
     * @param value The length of ensuing property animations, in milliseconds. The value
     * cannot be negative.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat setDuration(long value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().setDuration(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>alpha</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat alpha(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().alpha(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>alpha</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat alphaBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().alphaBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>translationX</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat translationX(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().translationX(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>translationY</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat translationY(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().translationY(value);
        }
        return this;
    }
    /**
     * Specifies an action to take place when the next animation ends. The action is only
     * run if the animation ends normally; if the ViewPropertyAnimator is canceled during
     * that animation, the runnable will not run.
     * This method, along with {@link #withStartAction(Runnable)}, is intended to help facilitate
     * choreographing ViewPropertyAnimator animations with other animations or actions
     * in the application.
     *
     * <p>For example, the following code animates a view to x=200 and then back to 0:</p>
     * <pre>
     *     Runnable endAction = new Runnable() {
     *         public void run() {
     *             view.animate().x(0);
     *         }
     *     };
     *     view.animate().x(200).withEndAction(endAction);
     * </pre>
     *
     * <p>For API 14 and 15, this method will run by setting
     * a listener on the ViewPropertyAnimatorCompat object and running the action
     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
     *
     * @param runnable The action to run when the next animation ends.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat withEndAction(@NonNull Runnable runnable) {
        View view;
        if ((view = mView.get()) != null) {
            ViewPropertyAnimator animator = view.animate();
            animator.withEndAction(runnable);
        }
        return this;
    }
    /**
     * Returns the current duration of property animations. If the duration was set on this
     * object, that value is returned. Otherwise, the default value of the underlying Animator
     * is returned.
     *
     * @see #setDuration(long)
     * @return The duration of animations, in milliseconds.
     */
    public long getDuration() {
        View view;
        if ((view = mView.get()) != null) {
            return view.animate().getDuration();
        } else {
            return 0;
        }
    }
    /**
     * Sets the interpolator for the underlying animator that animates the requested properties.
     * By default, the animator uses the default interpolator for ValueAnimator. Calling this method
     * will cause the declared object to be used instead.
     *
     * @param value The TimeInterpolator to be used for ensuing property animations.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat setInterpolator(@Nullable Interpolator value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().setInterpolator(value);
        }
        return this;
    }
    /**
     * Returns the timing interpolator that this animation uses.
     *
     * @return The timing interpolator for this animation.
     */
    @Nullable
    public Interpolator getInterpolator() {
        View view;
        if ((view = mView.get()) != null) {
            ViewPropertyAnimator animator = view.animate();
            return (Interpolator) animator.getInterpolator();
        }
        return null;
    }
    /**
     * Sets the startDelay for the underlying animator that animates the requested properties.
     * By default, the animator uses the default value for ValueAnimator. Calling this method
     * will cause the declared value to be used instead.
     *
     * @param value The delay of ensuing property animations, in milliseconds. The value
     * cannot be negative.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat setStartDelay(long value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().setStartDelay(value);
        }
        return this;
    }
    /**
     * Returns the current startDelay of property animations. If the startDelay was set on this
     * object, that value is returned. Otherwise, the default value of the underlying Animator
     * is returned.
     *
     * @see #setStartDelay(long)
     * @return The startDelay of animations, in milliseconds.
     */
    public long getStartDelay() {
        View view;
        if ((view = mView.get()) != null) {
            return view.animate().getStartDelay();
        } else {
            return 0;
        }
    }
    /**
     * This method will cause the View's <code>rotation</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat rotation(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().rotation(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>rotation</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat rotationBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().rotationBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>rotationX</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat rotationX(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().rotationX(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>rotationX</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat rotationXBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().rotationXBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>rotationY</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat rotationY(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().rotationY(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>rotationY</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat rotationYBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().rotationYBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>scaleX</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat scaleX(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().scaleX(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>scaleX</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat scaleXBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().scaleXBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>scaleY</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat scaleY(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().scaleY(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>scaleY</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat scaleYBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().scaleYBy(value);
        }
        return this;
    }
    /**
     * Cancels all property animations that are currently running or pending.
     */
    public void cancel() {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().cancel();
        }
    }
    /**
     * This method will cause the View's <code>x</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat x(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().x(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>x</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat xBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().xBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>y</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The value to be animated to.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat y(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().y(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>y</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat yBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().yBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>translationX</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat translationXBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().translationXBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>translationY</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat translationYBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().translationYBy(value);
        }
        return this;
    }
    /**
     * This method will cause the View's <code>translationZ</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * <p>Prior to API 21, this method will do nothing.</p>
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat translationZBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            if (Build.VERSION.SDK_INT >= 21) {
                ViewPropertyAnimator animator = view.animate();
                Api21Impl.translationZBy(animator, value);
            }
        }
        return this;
    }
    /**
     * This method will cause the View's <code>translationZ</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * <p>Prior to API 21, this method will do nothing.</p>
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat translationZ(float value) {
        View view;
        if ((view = mView.get()) != null) {
            if (Build.VERSION.SDK_INT >= 21) {
                ViewPropertyAnimator animator = view.animate();
                Api21Impl.translationZ(animator, value);
            }
        }
        return this;
    }
    /**
     * This method will cause the View's <code>z</code> property to be animated to the
     * specified value. Animations already running on the property will be canceled.
     *
     * <p>Prior to API 21, this method will do nothing.</p>
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat z(float value) {
        View view;
        if ((view = mView.get()) != null) {
            if (Build.VERSION.SDK_INT >= 21) {
                ViewPropertyAnimator animator = view.animate();
                Api21Impl.z(animator, value);
            }
        }
        return this;
    }
    /**
     * This method will cause the View's <code>z</code> property to be animated by the
     * specified value. Animations already running on the property will be canceled.
     *
     * <p>Prior to API 21, this method will do nothing.</p>
     *
     * @param value The amount to be animated by, as an offset from the current value.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat zBy(float value) {
        View view;
        if ((view = mView.get()) != null) {
            if (Build.VERSION.SDK_INT >= 21) {
                ViewPropertyAnimator animator = view.animate();
                Api21Impl.zBy(animator, value);
            }
        }
        return this;
    }
    /**
     * Starts the currently pending property animations immediately. Calling <code>start()</code>
     * is optional because all animations start automatically at the next opportunity. However,
     * if the animations are needed to start immediately and synchronously (not at the time when
     * the next event is processed by the hierarchy, which is when the animations would begin
     * otherwise), then this method can be used.
     */
    public void start() {
        View view;
        if ((view = mView.get()) != null) {
            view.animate().start();
        }
    }
    /**
     * The View associated with this ViewPropertyAnimator will have its
     * {@link View#setLayerType(int, Paint) layer type} set to
     * {@link View#LAYER_TYPE_HARDWARE} for the duration of the next animation.
     * As stated in the documentation for {@link View#LAYER_TYPE_HARDWARE},
     * the actual type of layer used internally depends on the runtime situation of the
     * view. If the activity and this view are hardware-accelerated, then the layer will be
     * accelerated as well. If the activity or the view is not accelerated, then the layer will
     * effectively be the same as {@link View#LAYER_TYPE_SOFTWARE}.
     *
     * <p>This state is not persistent, either on the View or on this ViewPropertyAnimator: the
     * layer type of the View will be restored when the animation ends to what it was when this
     * method was called, and this setting on ViewPropertyAnimator is only valid for the next
     * animation. Note that calling this method and then independently setting the layer type of
     * the View (by a direct call to
     * {@link View#setLayerType(int, Paint)}) will result in some
     * inconsistency, including having the layer type restored to its pre-withLayer()
     * value when the animation ends.</p>
     *
     * @see View#setLayerType(int, Paint)
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    @SuppressLint("WrongConstant")
    public ViewPropertyAnimatorCompat withLayer() {
        View view;
        if ((view = mView.get()) != null) {
            ViewPropertyAnimator animator = view.animate();
            animator.withLayer();
        }
        return this;
    }
    /**
     * Specifies an action to take place when the next animation runs. If there is a
     * {@link #setStartDelay(long) startDelay} set on this ViewPropertyAnimator, then the
     * action will run after that startDelay expires, when the actual animation begins.
     * This method, along with {@link #withEndAction(Runnable)}, is intended to help facilitate
     * choreographing ViewPropertyAnimator animations with other animations or actions
     * in the application.
     *
     * @param runnable The action to run when the next animation starts.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat withStartAction(@NonNull Runnable runnable) {
        View view;
        if ((view = mView.get()) != null) {
            ViewPropertyAnimator animator = view.animate();
            animator.withStartAction(runnable);
        }
        return this;
    }
    /**
     * Sets a listener for events in the underlying Animators that run the property
     * animations.
     *
     * @param listener The listener to be called with AnimatorListener events. A value of
     * <code>null</code> removes any existing listener.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat setListener(
            final @Nullable ViewPropertyAnimatorListener listener) {
        final View view;
        if ((view = mView.get()) != null) {
            setListenerInternal(view, listener);
        }
        return this;
    }
    private void setListenerInternal(final View view, final ViewPropertyAnimatorListener listener) {
        if (listener != null) {
            view.animate().setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationCancel(Animator animation) {
                    listener.onAnimationCancel(view);
                }
                @Override
                public void onAnimationEnd(Animator animation) {
                    listener.onAnimationEnd(view);
                }
                @Override
                public void onAnimationStart(Animator animation) {
                    listener.onAnimationStart(view);
                }
            });
        } else {
            view.animate().setListener(null);
        }
    }
    /**
     * Sets a listener for update events in the underlying Animator that runs
     * the property animations.
     *
     * @param listener The listener to be called with update events. A value of
     * <code>null</code> removes any existing listener.
     * @return This object, allowing calls to methods in this class to be chained.
     */
    @NonNull
    public ViewPropertyAnimatorCompat setUpdateListener(
            final @Nullable ViewPropertyAnimatorUpdateListener listener) {
        final View view;
        if ((view = mView.get()) != null) {
            ValueAnimator.AnimatorUpdateListener wrapped = null;
            if (listener != null) {
                    wrapped = valueAnimator -> listener.onAnimationUpdate(view);
                }
            ViewPropertyAnimator animator = view.animate();
            animator.setUpdateListener(wrapped);
        }
        return this;
    }
    @RequiresApi(21)
    static class Api21Impl {
        private Api21Impl() {
            // This class is not instantiable.
        }
        static ViewPropertyAnimator translationZBy(ViewPropertyAnimator viewPropertyAnimator,
                float value) {
            return viewPropertyAnimator.translationZBy(value);
        }
        static ViewPropertyAnimator translationZ(ViewPropertyAnimator viewPropertyAnimator,
                float value) {
            return viewPropertyAnimator.translationZ(value);
        }
        static ViewPropertyAnimator z(ViewPropertyAnimator viewPropertyAnimator, float value) {
            return viewPropertyAnimator.z(value);
        }
        static ViewPropertyAnimator zBy(ViewPropertyAnimator viewPropertyAnimator, float value) {
            return viewPropertyAnimator.zBy(value);
        }
    }
}