ViewPropertyAnimatorCompat.java revision 846955fba824b96d8cca48e372353d5b7cc31955
1d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase/*
2d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Copyright (C) 2014 The Android Open Source Project
3d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *
4d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * you may not use this file except in compliance with the License.
6d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * You may obtain a copy of the License at
7d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *
8d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase *
10d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * Unless required by applicable law or agreed to in writing, software
11d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * See the License for the specific language governing permissions and
14d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase * limitations under the License.
15d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase */
16d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haasepackage android.support.v4.view;
17d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
18846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikasimport android.annotation.TargetApi;
19bfd48d0521963754e04e407499ee9e278fe06c0fChris Banesimport android.os.Build;
20d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.view.View;
21d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.view.animation.Interpolator;
22d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
23d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport java.lang.ref.WeakReference;
24d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
25c5847d13e40f5d52459f5c0dab32dc08f1a9a683Chris Banespublic final class ViewPropertyAnimatorCompat {
26d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private static final String TAG = "ViewAnimatorCompat";
27d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private WeakReference<View> mView;
28552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    Runnable mStartAction = null;
29552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    Runnable mEndAction = null;
30552766fa685c63ad760c92239faaba12e6ad51f1Aurimas Liutikas    int mOldLayerType = -1;
31ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    // HACK ALERT! Choosing this id knowing that the framework does not use it anywhere
32ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    // internally and apps should use ids higher than it
33ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    static final int LISTENER_TAG_ID = 0x7e000000;
34ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
35d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    ViewPropertyAnimatorCompat(View view) {
36d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        mView = new WeakReference<View>(view);
37d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
38d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
39d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    interface ViewPropertyAnimatorCompatImpl {
40846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view);
41846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void z(ViewPropertyAnimatorCompat vpa, View view, float value);
42846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void zBy(ViewPropertyAnimatorCompat vpa, View view, float value);
43846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void translationZ(ViewPropertyAnimatorCompat vpa, View view, float value);
44846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void translationZBy(ViewPropertyAnimatorCompat vpa, View view, float value);
45846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void withLayer(ViewPropertyAnimatorCompat vpa, View view);
46846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable);
47846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable);
48846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void setListener(ViewPropertyAnimatorCompat vpa, View view,
49ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener);
50846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view,
51ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorUpdateListener listener);
52846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    }
53d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
54846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    static class ViewPropertyAnimatorCompatBaseImpl implements ViewPropertyAnimatorCompatImpl {
55d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
56846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        public void setListener(ViewPropertyAnimatorCompat vpa, View view,
57846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas                ViewPropertyAnimatorListener listener) {
58846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.setTag(LISTENER_TAG_ID, listener);
59846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
60d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
61d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
62d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
63846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view,
64846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas                final Runnable runnable) {
65846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
66ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mEndAction = runnable;
67d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
68d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
69d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
70846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view,
71846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas                final Runnable runnable) {
72846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
73846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            vpa.mStartAction = runnable;
74d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
75d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
76d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
77846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
78846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            vpa.mOldLayerType = view.getLayerType();
79846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
80d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
81d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
82d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
83ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view) {
84d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return null;
85d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
86d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
87d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
88e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void z(ViewPropertyAnimatorCompat vpa, View view, float value) {
89e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
90e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
91e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
92e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
93e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void zBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
94e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
95e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
96e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
97e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
98e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZ(ViewPropertyAnimatorCompat vpa, View view, float value) {
99e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
100e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
101e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
102e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
103e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
104e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            // noop on versions prior to Lollipop
105e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
106e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
107e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
108846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view,
109846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas                ViewPropertyAnimatorUpdateListener listener) {
11049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // noop
111d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
112797c82a7055f7ba825169388465617f0db716739Chet Haase
113ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        static class MyVpaListener implements ViewPropertyAnimatorListener {
114ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompat mVpa;
115bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes            boolean mAnimEndCalled;
116ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
117ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            MyVpaListener(ViewPropertyAnimatorCompat vpa) {
118ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                mVpa = vpa;
119ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            }
120ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
121797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
122797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationStart(View view) {
123bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                // Reset our end called flag, since this is a new animation...
124bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                mAnimEndCalled = false;
125bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes
126ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mOldLayerType >= 0) {
127fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas                    view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
128d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
129ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mStartAction != null) {
130fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    Runnable startAction = mVpa.mStartAction;
131fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    mVpa.mStartAction = null;
132fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                    startAction.run();
133ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
134ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                Object listenerTag = view.getTag(LISTENER_TAG_ID);
135ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener = null;
136ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (listenerTag instanceof ViewPropertyAnimatorListener) {
137ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    listener = (ViewPropertyAnimatorListener) listenerTag;
138797c82a7055f7ba825169388465617f0db716739Chet Haase                }
139797c82a7055f7ba825169388465617f0db716739Chet Haase                if (listener != null) {
140797c82a7055f7ba825169388465617f0db716739Chet Haase                    listener.onAnimationStart(view);
141797c82a7055f7ba825169388465617f0db716739Chet Haase                }
142797c82a7055f7ba825169388465617f0db716739Chet Haase            }
143ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
144797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
145797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationEnd(View view) {
146ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mOldLayerType >= 0) {
147fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas                    view.setLayerType(mVpa.mOldLayerType, null);
148ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    mVpa.mOldLayerType = -1;
149ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
150bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                if (Build.VERSION.SDK_INT >= 16 || !mAnimEndCalled) {
151bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    // Pre-v16 seems to have a bug where onAnimationEnd is called
152bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    // twice, therefore we only dispatch on the first call
153bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    if (mVpa.mEndAction != null) {
154fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        Runnable endAction = mVpa.mEndAction;
155fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        mVpa.mEndAction = null;
156fdd92b54cc21d9927ee89cf675cf4c90c306f24aChet Haase                        endAction.run();
157bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    }
158bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    Object listenerTag = view.getTag(LISTENER_TAG_ID);
159bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    ViewPropertyAnimatorListener listener = null;
160bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    if (listenerTag instanceof ViewPropertyAnimatorListener) {
161bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                        listener = (ViewPropertyAnimatorListener) listenerTag;
162bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    }
163bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    if (listener != null) {
164bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                        listener.onAnimationEnd(view);
165bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    }
166bfd48d0521963754e04e407499ee9e278fe06c0fChris Banes                    mAnimEndCalled = true;
167797c82a7055f7ba825169388465617f0db716739Chet Haase                }
168797c82a7055f7ba825169388465617f0db716739Chet Haase            }
169d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
170797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
171797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationCancel(View view) {
172ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                Object listenerTag = view.getTag(LISTENER_TAG_ID);
173ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener = null;
174ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (listenerTag instanceof ViewPropertyAnimatorListener) {
175ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    listener = (ViewPropertyAnimatorListener) listenerTag;
176ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
177797c82a7055f7ba825169388465617f0db716739Chet Haase                if (listener != null) {
178797c82a7055f7ba825169388465617f0db716739Chet Haase                    listener.onAnimationCancel(view);
179d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
180797c82a7055f7ba825169388465617f0db716739Chet Haase            }
181846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        }
182d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
183d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
184846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    @TargetApi(16)
185846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    static class ViewPropertyAnimatorCompatApi16Impl extends ViewPropertyAnimatorCompatBaseImpl {
186d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
187d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
188ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorListener listener) {
189ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatJB.setListener(view, listener);
190ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        }
191ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
192ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        @Override
193ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
194846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().withStartAction(runnable);
195d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
196d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
197d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
198ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
199846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().withEndAction(runnable);
200d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
201d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
202d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
203ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
204846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().withLayer();
205d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
206d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
207d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
208846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    @TargetApi(18)
209846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    static class ViewPropertyAnimatorCompatApi18Impl extends ViewPropertyAnimatorCompatApi16Impl {
210d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
211d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
212ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view) {
213846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            return (Interpolator) view.animate().getInterpolator();
214d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
215d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
216d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
217846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    @TargetApi(19)
218846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    static class ViewPropertyAnimatorCompatApi19Impl extends ViewPropertyAnimatorCompatApi18Impl {
21949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
220846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view,
221846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas                ViewPropertyAnimatorUpdateListener listener) {
22249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompatKK.setUpdateListener(view, listener);
22349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
22449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
22549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
226846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    @TargetApi(21)
227846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas    static class ViewPropertyAnimatorCompatApi21Impl extends
228846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            ViewPropertyAnimatorCompatApi19Impl {
229e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
230e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZ(ViewPropertyAnimatorCompat vpa, View view, float value) {
231846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().translationZ(value);
232e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
233e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
234e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
235e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void translationZBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
236846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().translationZBy(value);
237e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
238e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
239e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
240e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void z(ViewPropertyAnimatorCompat vpa, View view, float value) {
241846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().z(value);
242e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
243e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
244e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        @Override
245e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        public void zBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
246846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().zBy(value);
247e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
248e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
249e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
250d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static final ViewPropertyAnimatorCompatImpl IMPL;
251d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static {
252846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        if (Build.VERSION.SDK_INT >= 21) {
253846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            IMPL = new ViewPropertyAnimatorCompatApi21Impl();
254846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        } else if (Build.VERSION.SDK_INT >= 19) {
255846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            IMPL = new ViewPropertyAnimatorCompatApi19Impl();
256846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        } else if (Build.VERSION.SDK_INT >= 18) {
257846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            IMPL = new ViewPropertyAnimatorCompatApi18Impl();
258846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas        } else if (Build.VERSION.SDK_INT >= 16) {
259846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            IMPL = new ViewPropertyAnimatorCompatApi16Impl();
260d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
261846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            IMPL = new ViewPropertyAnimatorCompatBaseImpl();
262d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
263d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
264d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
265d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
266d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the duration for the underlying animator that animates the requested properties.
267d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
268d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
269d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
270d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The length of ensuing property animations, in milliseconds. The value
271d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
272d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
273d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
274d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setDuration(long value) {
275d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
276d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
277846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().setDuration(value);
278d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
279d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
280d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
281d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
282d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
283d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated to the
284d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
285d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
286d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
287d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
288d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
289d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alpha(float value) {
290d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
291d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
292846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().alpha(value);
293d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
294d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
295d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
296d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
297d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
298d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated by the
299d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
300d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
301d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
302d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
303d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
304d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alphaBy(float value) {
305d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
306d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
307846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().alphaBy(value);
308d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
309d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
310d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
311d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
312d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
313d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated to the
314d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
315d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
316d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
317d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
318d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
319d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationX(float value) {
320d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
321d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
322846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().translationX(value);
323d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
324d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
325d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
326d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
327d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
328d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated to the
329d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
330d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
331d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
332d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
333d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
334d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationY(float value) {
335d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
336d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
337846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().translationY(value);
338d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
339d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
340d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
341d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
342d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
343d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation ends. The action is only
344d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * run if the animation ends normally; if the ViewPropertyAnimator is canceled during
345d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * that animation, the runnable will not run.
346d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withStartAction(Runnable)}, is intended to help facilitate
347d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
348d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
349d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
350d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For example, the following code animates a view to x=200 and then back to 0:</p>
351d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <pre>
352d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     Runnable endAction = new Runnable() {
353d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         public void run() {
354d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *             view.animate().x(0);
355d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         }
356d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     };
357d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     view.animate().x(200).withEndAction(endAction);
358d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * </pre>
359d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
360d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
361d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
362d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
363d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
364d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
365d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
366d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation ends.
367d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
368d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
369d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {
370d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
371d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
372ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withEndAction(this, view, runnable);
373d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
374d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
375d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
376d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
377d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
378d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current duration of property animations. If the duration was set on this
379d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
380d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
381d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
382d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setDuration(long)
383d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The duration of animations, in milliseconds.
384d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
385d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getDuration() {
386d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
387d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
388846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            return view.animate().getDuration();
389d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
390d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
391d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
392d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
393d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
394d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
395d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the interpolator for the underlying animator that animates the requested properties.
396d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default interpolator for ValueAnimator. Calling this method
397d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared object to be used instead.
398d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
399d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The TimeInterpolator to be used for ensuing property animations.
400d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
401d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
402d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {
403d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
404d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
405846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().setInterpolator(value);
406d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
407d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
408d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
409d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
410d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
411d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the timing interpolator that this animation uses.
412d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
413d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The timing interpolator for this animation.
414d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
415d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public Interpolator getInterpolator() {
416d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
417d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
418ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            return IMPL.getInterpolator(this, view);
419d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
420d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        else return null;
421d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
422d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
423d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
424d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the startDelay for the underlying animator that animates the requested properties.
425d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
426d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
427d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
428d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The delay of ensuing property animations, in milliseconds. The value
429d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
430d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
431d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
432d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setStartDelay(long value) {
433d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
434d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
435846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().setStartDelay(value);
436d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
437d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
438d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
439d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
440d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
441d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current startDelay of property animations. If the startDelay was set on this
442d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
443d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
444d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
445d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setStartDelay(long)
446d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The startDelay of animations, in milliseconds.
447d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
448d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getStartDelay() {
449d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
450d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
451846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            return view.animate().getStartDelay();
452d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
453d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
454d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
455d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
456d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
457d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
458d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated to the
459d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
460d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
461d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
462d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
463d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
464d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotation(float value) {
465d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
466d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
467846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().rotation(value);
468d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
469d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
470d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
471d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
472d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
473d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated by the
474d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
475d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
476d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
477d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
478d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
479d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationBy(float value) {
480d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
481d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
482846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().rotationBy(value);
483d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
484d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
485d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
486d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
487d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
488d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated to the
489d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
490d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
491d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
492d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
493d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
494d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationX(float value) {
495d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
496d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
497846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().rotationX(value);
498d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
499d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
500d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
501d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
502d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
503d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated by the
504d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
505d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
506d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
507d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
508d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
509d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationXBy(float value) {
510d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
511d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
512846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().rotationXBy(value);
513d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
514d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
515d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
516d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
517d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
518d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated to the
519d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
520d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
521d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
522d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
523d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
524d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationY(float value) {
525d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
526d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
527846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().rotationY(value);
528d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
529d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
530d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
531d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
532d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
533d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated by the
534d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
535d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
536d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
537d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
538d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
539d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationYBy(float value) {
540d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
541d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
542846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().rotationYBy(value);
543d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
544d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
545d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
546d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
547d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
548d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated to the
549d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
550d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
551d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
552d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
553d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
554d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleX(float value) {
555d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
556d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
557846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().scaleX(value);
558d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
559d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
560d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
561d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
562d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
563d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated by the
564d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
565d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
566d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
567d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
568d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
569d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleXBy(float value) {
570d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
571d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
572846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().scaleXBy(value);
573d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
574d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
575d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
576d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
577d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
578d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated to the
579d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
580d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
581d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
582d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
583d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
584d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleY(float value) {
585d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
586d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
587846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().scaleY(value);
588d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
589d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
590d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
591d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
592d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
593d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated by the
594d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
595d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
596d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
597d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
598d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
599d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleYBy(float value) {
600d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
601d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
602846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().scaleYBy(value);
603d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
604d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
605d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
606d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
607d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
608d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Cancels all property animations that are currently running or pending.
609d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
610d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void cancel() {
611d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
612d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
613846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().cancel();
614d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
615d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
616d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
617d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
618d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated to the
619d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
620d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
621d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
622d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
623d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
624d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat x(float value) {
625d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
626d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
627846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().x(value);
628d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
629d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
630d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
631d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
632d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
633d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated by the
634d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
635d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
636d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
637d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
638d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
639d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat xBy(float value) {
640d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
641d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
642846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().xBy(value);
643d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
644d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
645d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
646d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
647d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
648d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated to the
649d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
650d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
651d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
652d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
653d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
654d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat y(float value) {
655d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
656d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
657846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().y(value);
658d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
659d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
660d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
661d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
662d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
663d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated by the
664d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
665d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
666d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
667d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
668d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
669d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat yBy(float value) {
670d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
671d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
672846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().yBy(value);
673d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
674d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
675d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
676d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
677d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
678d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated by the
679d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
680d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
681d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
682d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
683d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
684d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationXBy(float value) {
685d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
686d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
687846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().translationXBy(value);
688d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
689d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
690d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
691d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
692d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
693d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated by the
694d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
695d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
696d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
697d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
698d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
699d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationYBy(float value) {
700d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
701d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
702846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().translationYBy(value);
703d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
704d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
705d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
706d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
707d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
708e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>translationZ</code> property to be animated by the
709e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
710e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
711e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
712e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
713e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
714e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
715e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
716e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat translationZBy(float value) {
717e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
718e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
719e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.translationZBy(this, view, value);
720e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
721e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
722e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
723e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
724e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
725e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>translationZ</code> property to be animated to the
726e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
727e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
728e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
729e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
730e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
731e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
732e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
733e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat translationZ(float value) {
734e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
735e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
736e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.translationZ(this, view, value);
737e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
738e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
739e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
740e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
741e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
742e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>z</code> property to be animated to the
743e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
744e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
745e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
746e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
747e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
748e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
749e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
750e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat z(float value) {
751e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
752e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
753e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.z(this, view, value);
754e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
755e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
756e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
757e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
758e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
759e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * This method will cause the View's <code>z</code> property to be animated by the
760e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * specified value. Animations already running on the property will be canceled.
761e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
762e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * <p>Prior to API 21, this method will do nothing.</p>
763e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     *
764e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @param value The amount to be animated by, as an offset from the current value.
765e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     * @return This object, allowing calls to methods in this class to be chained.
766e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes     */
767e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    public ViewPropertyAnimatorCompat zBy(float value) {
768e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        View view;
769e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        if ((view = mView.get()) != null) {
770e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes            IMPL.zBy(this, view, value);
771e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        }
772e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes        return this;
773e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    }
774e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes
775e322b8bcc717dfd663677ed5cb59c6d1c3cb27afChris Banes    /**
776d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Starts the currently pending property animations immediately. Calling <code>start()</code>
777d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is optional because all animations start automatically at the next opportunity. However,
778d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * if the animations are needed to start immediately and synchronously (not at the time when
779d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the next event is processed by the hierarchy, which is when the animations would begin
780d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * otherwise), then this method can be used.
781d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
782d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void start() {
783d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
784d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
785846955fba824b96d8cca48e372353d5b7cc31955Aurimas Liutikas            view.animate().start();
786d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
787d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
788d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
789d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
790d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * The View associated with this ViewPropertyAnimator will have its
791fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas     * {@link View#setLayerType(int, android.graphics.Paint) layer type} set to
792fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas     * {@link View#LAYER_TYPE_HARDWARE} for the duration of the next animation.
793fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas     * As stated in the documentation for {@link View#LAYER_TYPE_HARDWARE},
794d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the actual type of layer used internally depends on the runtime situation of the
795d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * view. If the activity and this view are hardware-accelerated, then the layer will be
796d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * accelerated as well. If the activity or the view is not accelerated, then the layer will
797fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas     * effectively be the same as {@link View#LAYER_TYPE_SOFTWARE}.
798d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
799d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>This state is not persistent, either on the View or on this ViewPropertyAnimator: the
800d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * layer type of the View will be restored when the animation ends to what it was when this
801d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * method was called, and this setting on ViewPropertyAnimator is only valid for the next
802d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animation. Note that calling this method and then independently setting the layer type of
803d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the View (by a direct call to
804fa0f82f629bf95681c14ed559922f77a3030aa18Aurimas Liutikas     * {@link View#setLayerType(int, android.graphics.Paint)}) will result in some
805d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * inconsistency, including having the layer type restored to its pre-withLayer()
806d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * value when the animation ends.</p>
807d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
808d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
809d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
810d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
811d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object, setting a hardware layer in
812d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method,
813d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * and then restoring the orignal layer type in the listener's
814d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
815d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
816d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see View#setLayerType(int, android.graphics.Paint)
817d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
818d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
819d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withLayer() {
820d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
821d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
822ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withLayer(this, view);
823d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
824d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
825d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
826d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
827d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
828d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation runs. If there is a
829d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link #setStartDelay(long) startDelay} set on this ViewPropertyAnimator, then the
830d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * action will run after that startDelay expires, when the actual animation begins.
831d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withEndAction(Runnable)}, is intended to help facilitate
832d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
833d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
834d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
835d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
836d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
837d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
838d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
839d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method.</p>
840d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
841d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation starts.
842d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
843d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
844d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {
845d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
846d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
847ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withStartAction(this, view, runnable);
848d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
849d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
850d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
851d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
852d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
853d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets a listener for events in the underlying Animators that run the property
854d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animations.
855d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
856d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
857d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
858d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param listener The listener to be called with AnimatorListener events. A value of
859d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <code>null</code> removes any existing listener.
860d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
861d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
862d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setListener(ViewPropertyAnimatorListener listener) {
863d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
864d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
865ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setListener(this, view, listener);
866d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
867d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
868d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
86949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
87049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
87149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Sets a listener for update events in the underlying Animator that runs
87249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * the property animations.
87349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
87449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <p>Prior to API 19, this method will do nothing.</p>
87549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
87649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @param listener The listener to be called with update events. A value of
87749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <code>null</code> removes any existing listener.
87849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @return This object, allowing calls to methods in this class to be chained.
87949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
88049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ViewPropertyAnimatorCompat setUpdateListener(
88149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorUpdateListener listener) {
88249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        View view;
88349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((view = mView.get()) != null) {
884ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setUpdateListener(this, view, listener);
88549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
88649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return this;
88749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
888d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase}
889