1package com.bumptech.glide.request.animation;
2
3import android.graphics.drawable.Drawable;
4import android.view.View;
5
6/**
7 * An interface that allows a transformation to be applied to {@link android.view.View}s in
8 * {@link com.bumptech.glide.request.target.Target}s in across resource types. Targets that wrap views will be able to
9 * provide all of the necessary arguments and start the animation. Those that do not will be unable to provide the
10 * necessary arguments and will therefore be forced to ignore the animation. This interface is a compromise that
11 * allows view animations in Glide's complex world of arbitrary resource types and arbitrary target types.
12 *
13 * @param <R> The type of the resource that should be animated to.
14 */
15public interface GlideAnimation<R> {
16
17    /**
18     * An interface wrapping a view that exposes the necessary methods to run the various types of android animations
19     * ({@link com.bumptech.glide.request.animation.ViewAnimation},
20     * {@link com.bumptech.glide.request.animation.ViewPropertyAnimation} and animated
21     * {@link android.graphics.drawable.Drawable}s).
22     */
23    interface ViewAdapter {
24        /**
25         * Returns the wrapped {@link android.view.View}.
26         */
27        View getView();
28
29        /**
30         * Returns the current drawable being displayed in the view, or null if no such drawable exists (or one cannot
31         * be retrieved).
32         */
33        Drawable getCurrentDrawable();
34
35        /**
36         * Sets the current drawable (usually an animated drawable) to display in the wrapped view.
37         *
38         * @param drawable The drawable to display in the wrapped view.
39         */
40        void setDrawable(Drawable drawable);
41    }
42
43    /**
44     * Animates from the previous {@link android.graphics.drawable.Drawable} that is currently being displayed in the
45     * given view, if not null, to the new resource that should be displayed in the view.
46     *
47     * @param current The new resource that will be displayed in the view.
48     * @param adapter The {@link com.bumptech.glide.request.animation.GlideAnimation.ViewAdapter} wrapping a view that
49     *                can at least return an {@link android.view.View} from
50     *                {@link com.bumptech.glide.request.animation.GlideAnimation.ViewAdapter#getView()}.
51     * @return True if int he process of running the animation the new resource was set on the view, false if the caller
52     * needs to manually set the current resource on the view.
53     */
54    boolean animate(R current, ViewAdapter adapter);
55}
56