[go: nahoru, domu]

1631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes/*
2631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * Copyright (C) 2015 The Android Open Source Project
3631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes *
4631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * you may not use this file except in compliance with the License.
6631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * You may obtain a copy of the License at
7631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes *
8631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes *
10631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * Unless required by applicable law or agreed to in writing, software
11631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * See the License for the specific language governing permissions and
14631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * limitations under the License.
15631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */
16631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
17631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banespackage android.support.design.widget;
18631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
19631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banesimport android.view.animation.Interpolator;
20631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
21631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes/**
22631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * This class offers a very small subset of {@code ValueAnimator}'s API, but works pre-v11 too.
23631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * <p>
24631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes * You shouldn't not instantiate this directly. Instead use {@code ViewUtils.createAnimator()}.
25631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes */
26631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banesclass ValueAnimatorCompat {
27631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
28631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    interface AnimatorUpdateListener {
29631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        /**
30631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * <p>Notifies the occurrence of another frame of the animation.</p>
31631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         *
32631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * @param animator The animation which was repeated.
33631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         */
34631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        void onAnimationUpdate(ValueAnimatorCompat animator);
35631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
36631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
37631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    /**
38631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes     * An animation listener receives notifications from an animation.
39631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes     * Notifications indicate animation related events, such as the end or the
40631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes     * repetition of the animation.
41631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes     */
42631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    interface AnimatorListener {
43631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        /**
44631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * <p>Notifies the start of the animation.</p>
45631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         *
46631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * @param animator The started animation.
47631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         */
48631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        void onAnimationStart(ValueAnimatorCompat animator);
49631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        /**
50631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * <p>Notifies the end of the animation. This callback is not invoked
51631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * for animations with repeat count set to INFINITE.</p>
52631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         *
53631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * @param animator The animation which reached its end.
54631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         */
55631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        void onAnimationEnd(ValueAnimatorCompat animator);
56631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        /**
57631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * <p>Notifies the cancellation of the animation. This callback is not invoked
58631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * for animations with repeat count set to INFINITE.</p>
59631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         *
60631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         * @param animator The animation which was canceled.
61631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes         */
62631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        void onAnimationCancel(ValueAnimatorCompat animator);
63631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
64631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
65631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    static class AnimatorListenerAdapter implements AnimatorListener {
66631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        @Override
67631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        public void onAnimationStart(ValueAnimatorCompat animator) {
68631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        }
69631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
70631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        @Override
71631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        public void onAnimationEnd(ValueAnimatorCompat animator) {
72631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        }
73631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
74631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        @Override
75631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        public void onAnimationCancel(ValueAnimatorCompat animator) {
76631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        }
77631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
78631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
79631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    interface Creator {
80631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        ValueAnimatorCompat createAnimator();
81631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
82631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
83631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    static abstract class Impl {
84631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        interface AnimatorUpdateListenerProxy {
85631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            void onAnimationUpdate();
86631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        }
87631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
88631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        interface AnimatorListenerProxy {
89631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            void onAnimationStart();
90631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            void onAnimationEnd();
91631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            void onAnimationCancel();
92631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        }
93631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
94631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void start();
95631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract boolean isRunning();
96631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void setInterpolator(Interpolator interpolator);
97631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void setListener(AnimatorListenerProxy listener);
98631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void setUpdateListener(AnimatorUpdateListenerProxy updateListener);
99631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void setIntValues(int from, int to);
100631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract int getAnimatedIntValue();
101631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void setFloatValues(float from, float to);
102631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract float getAnimatedFloatValue();
103e852801f9258e00f89da48918b58a6e933643ab9Aurimas Liutikas        abstract void setDuration(long duration);
104631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void cancel();
105631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract float getAnimatedFraction();
106631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        abstract void end();
107ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes        abstract long getDuration();
108631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
109631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
110631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    private final Impl mImpl;
111631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
112631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    ValueAnimatorCompat(Impl impl) {
113631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl = impl;
114631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
115631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
116631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void start() {
117631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl.start();
118631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
119631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
120631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public boolean isRunning() {
121631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        return mImpl.isRunning();
122631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
123631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
124631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void setInterpolator(Interpolator interpolator) {
125631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl.setInterpolator(interpolator);
126631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
127631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
128631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void setUpdateListener(final AnimatorUpdateListener updateListener) {
129631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        if (updateListener != null) {
130631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            mImpl.setUpdateListener(new Impl.AnimatorUpdateListenerProxy() {
131631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                @Override
132631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                public void onAnimationUpdate() {
133631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                    updateListener.onAnimationUpdate(ValueAnimatorCompat.this);
134631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                }
135631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            });
136631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        } else {
137631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            mImpl.setUpdateListener(null);
138631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        }
139631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
140631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
141631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void setListener(final AnimatorListener listener) {
142631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        if (listener != null) {
143631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            mImpl.setListener(new Impl.AnimatorListenerProxy() {
144631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                @Override
145631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                public void onAnimationStart() {
146631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                    listener.onAnimationStart(ValueAnimatorCompat.this);
147631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                }
148631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
149631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                @Override
150631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                public void onAnimationEnd() {
151631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                    listener.onAnimationEnd(ValueAnimatorCompat.this);
152631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                }
153631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
154631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                @Override
155631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                public void onAnimationCancel() {
156631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                    listener.onAnimationCancel(ValueAnimatorCompat.this);
157631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes                }
158631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            });
159631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        } else {
160631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes            mImpl.setListener(null);
161631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        }
162631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
163631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
164631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void setIntValues(int from, int to) {
165631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl.setIntValues(from, to);
166631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
167631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
168631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public int getAnimatedIntValue() {
169631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        return mImpl.getAnimatedIntValue();
170631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
171631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
172631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void setFloatValues(float from, float to) {
173631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl.setFloatValues(from, to);
174631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
175631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
176631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public float getAnimatedFloatValue() {
177631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        return mImpl.getAnimatedFloatValue();
178631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
179631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
180e852801f9258e00f89da48918b58a6e933643ab9Aurimas Liutikas    public void setDuration(long duration) {
181631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl.setDuration(duration);
182631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
183631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
184631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void cancel() {
185631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl.cancel();
186631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
187631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
188631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public float getAnimatedFraction() {
189631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        return mImpl.getAnimatedFraction();
190631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
191631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes
192631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    public void end() {
193631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes        mImpl.end();
194631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes    }
195ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes
196ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes    public long getDuration() {
197ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes        return mImpl.getDuration();
198ba2a96aaf54f6fc755856ef05a3c967a5f000b82Chris Banes    }
199631f64ec9c6255f38a7f746d7949b6a537c1180fChris Banes}
200