ViewPropertyAnimatorCompat.java revision 49c78900da0d43140fb602431fb93212bd7f6c70
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
18d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.view.View;
19d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport android.view.animation.Interpolator;
20d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
21d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haaseimport java.lang.ref.WeakReference;
22d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
23d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haasepublic class ViewPropertyAnimatorCompat {
24d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private static final String TAG = "ViewAnimatorCompat";
25d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private WeakReference<View> mView;
26d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
27d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    ViewPropertyAnimatorCompat(View view) {
28d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        mView = new WeakReference<View>(view);
29d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
30d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
31d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    interface ViewPropertyAnimatorCompatImpl {
32d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setDuration(View view, long value);
33d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public long getDuration(View view);
34d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setInterpolator(View view, Interpolator value);
35d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public Interpolator getInterpolator(View view);
36d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setStartDelay(View view, long value);
37d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public long getStartDelay(View view);
38d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void alpha(View view, float value);
39d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void alphaBy(View view, float value);
40d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotation(View view, float value);
41d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationBy(View view, float value);
42d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationX(View view, float value);
43d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationXBy(View view, float value);
44d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationY(View view, float value);
45d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationYBy(View view, float value);
46d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleX(View view, float value);
47d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleXBy(View view, float value);
48d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleY(View view, float value);
49d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleYBy(View view, float value);
50d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void cancel(View view);
51d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void x(View view, float value);
52d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void xBy(View view, float value);
53d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void y(View view, float value);
54d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void yBy(View view, float value);
55d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationX(View view, float value);
56d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationXBy(View view, float value);
57d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationY(View view, float value);
58d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationYBy(View view, float value);
59d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void start(View view);
60d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withLayer(View view);
61d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withStartAction(View view, Runnable runnable);
62d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withEndAction(View view, Runnable runnable);
63d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setListener(View view, ViewPropertyAnimatorListener listener);
6449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void setUpdateListener(View view, ViewPropertyAnimatorUpdateListener listener);
65d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    };
66d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
67d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class BaseViewPropertyAnimatorCompatImpl implements ViewPropertyAnimatorCompatImpl {
6849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        private ViewPropertyAnimatorListener mListener;
69d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
70d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
71d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setDuration(View view, long value) {
72d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
73d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
74d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
75d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
76d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void alpha(View view, float value) {
77d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
78d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
79d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
80d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
81d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationX(View view, float value) {
82d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
83d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
84d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
85d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
86d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationY(View view, float value) {
87d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
88d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
89d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
90d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
91d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withEndAction(View view, Runnable runnable) {
92d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // Other VPA calls are noops pre-ICS; just run the runnable immediately
93d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            runnable.run();
94d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
95d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
96d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
97d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public long getDuration(View view) {
98d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
99d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
100d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
101d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
102d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setInterpolator(View view, Interpolator value) {
103d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
104d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
105d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
106d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
107d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public Interpolator getInterpolator(View view) {
108d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return null;
109d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
110d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
111d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
112d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setStartDelay(View view, long value) {
113d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
114d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
115d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
116d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
117d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public long getStartDelay(View view) {
118d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
119d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
120d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
121d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
122d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void alphaBy(View view, float value) {
123d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
124d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
125d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
126d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
127d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotation(View view, float value) {
128d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
129d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
130d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
131d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
132d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationBy(View view, float value) {
133d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
134d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
135d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
136d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
137d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationX(View view, float value) {
138d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
139d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
140d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
141d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
142d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationXBy(View view, float value) {
143d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
144d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
145d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
146d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
147d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationY(View view, float value) {
148d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
149d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
150d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
151d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
152d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationYBy(View view, float value) {
153d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
154d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
155d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
156d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
157d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleX(View view, float value) {
158d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
159d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
160d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
161d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
162d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleXBy(View view, float value) {
163d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
164d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
165d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
166d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
167d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleY(View view, float value) {
168d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
169d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
170d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
171d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
172d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleYBy(View view, float value) {
173d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
174d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
175d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
176d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
177d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void cancel(View view) {
178d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
179d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
180d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
181d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
182d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void x(View view, float value) {
183d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
184d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
185d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
186d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
187d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void xBy(View view, float value) {
188d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
189d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
190d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
191d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
192d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void y(View view, float value) {
193d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
194d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
195d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
196d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
197d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void yBy(View view, float value) {
198d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
199d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
200d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
201d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
202d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationXBy(View view, float value) {
203d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
204d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
205d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
206d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
207d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationYBy(View view, float value) {
208d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
209d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
210d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
211d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
212d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void start(View view) {
21349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            if (mListener != null) {
21449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                // If a listener has been set, start and then end it immediately
21549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mListener.onAnimationStart(view);
21649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes                mListener.onAnimationEnd(view);
21749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            }
218d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
219d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
220d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
221d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withLayer(View view) {
222d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
223d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
224d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
225d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
226d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withStartAction(View view, Runnable runnable) {
227d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // Other VPA calls are noops pre-ICS; just run the runnable immediately
228d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            runnable.run();
229d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
230d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
231d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
232d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setListener(View view, ViewPropertyAnimatorListener listener) {
23349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            mListener = listener;
23449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
23549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
23649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
23749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void setUpdateListener(View view, ViewPropertyAnimatorUpdateListener listener) {
23849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // noop
239d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
240d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
241d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
242d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class ICSViewPropertyAnimatorCompatImpl extends BaseViewPropertyAnimatorCompatImpl {
243d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
244d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
245d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setDuration(View view, long value) {
246d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setDuration(view, value);
247d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
248d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
249d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
250d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void alpha(View view, float value) {
251d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.alpha(view, value);
252d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
253d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
254d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
255d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationX(View view, float value) {
256d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationX(view, value);
257d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
258d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
259d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
260d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationY(View view, float value) {
261d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationY(view, value);
262d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
263d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
264d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
265d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public long getDuration(View view) {
266d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return ViewPropertyAnimatorCompatICS.getDuration(view);
267d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
268d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
269d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
270d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setInterpolator(View view, Interpolator value) {
271d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setInterpolator(view, value);
272d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
273d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
274d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
275d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setStartDelay(View view, long value) {
276d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setStartDelay(view, value);
277d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
278d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
279d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
280d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public long getStartDelay(View view) {
281d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return ViewPropertyAnimatorCompatICS.getStartDelay(view);
282d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
283d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
284d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
285d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void alphaBy(View view, float value) {
286d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.alphaBy(view, value);
287d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
288d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
289d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
290d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotation(View view, float value) {
291d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotation(view, value);
292d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
293d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
294d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
295d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationBy(View view, float value) {
296d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationBy(view, value);
297d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
298d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
299d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
300d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationX(View view, float value) {
301d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationX(view, value);
302d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
303d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
304d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
305d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationXBy(View view, float value) {
306d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationXBy(view, value);
307d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
308d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
309d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
310d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationY(View view, float value) {
311d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationY(view, value);
312d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
313d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
314d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
315d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void rotationYBy(View view, float value) {
316d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationYBy(view, value);
317d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
318d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
319d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
320d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleX(View view, float value) {
321d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleX(view, value);
322d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
323d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
324d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
325d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleXBy(View view, float value) {
326d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleXBy(view, value);
327d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
328d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
329d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
330d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleY(View view, float value) {
331d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleY(view, value);
332d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
333d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
334d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
335d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void scaleYBy(View view, float value) {
336d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleYBy(view, value);
337d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
338d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
339d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
340d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void cancel(View view) {
341d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.cancel(view);
342d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
343d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
344d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
345d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void x(View view, float value) {
346d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.x(view, value);
347d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
348d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
349d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
350d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void xBy(View view, float value) {
351d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.xBy(view, value);
352d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
353d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
354d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
355d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void y(View view, float value) {
356d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.y(view, value);
357d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
358d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
359d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
360d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void yBy(View view, float value) {
361d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.yBy(view, value);
362d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
363d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
364d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
365d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationXBy(View view, float value) {
366d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationXBy(view, value);
367d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
368d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
369d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
370d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void translationYBy(View view, float value) {
371d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationYBy(view, value);
372d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
373d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
374d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
375d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void start(View view) {
376d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.start(view);
377d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
378d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
379d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
380d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void setListener(View view, ViewPropertyAnimatorListener listener) {
381d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setListener(view, listener);
382d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
383d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
384d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
385d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withEndAction(View view, final Runnable runnable) {
386d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            setListener(view, new ViewPropertyAnimatorListener() {
387d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
388d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationStart(View view) {
389d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
390d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
391d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
392d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationEnd(View view) {
393d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    runnable.run();
394d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    setListener(view, null);
395d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
396d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
397d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
398d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationCancel(View view) {
399d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
400d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            });
401d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
402d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
403d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
404d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withStartAction(View view, final Runnable runnable) {
405d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            setListener(view, new ViewPropertyAnimatorListener() {
406d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
407d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationStart(View view) {
408d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    runnable.run();
409d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    setListener(view, null);
410d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
411d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
412d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
413d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationEnd(View view) {
414d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
415d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
416d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
417d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationCancel(View view) {
418d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
419d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            });
420d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
421d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
422d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
423d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withLayer(View view) {
424d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            final int currentLayerType = ViewCompat.getLayerType(view);
425d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            setListener(view, new ViewPropertyAnimatorListener() {
426d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
427d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationStart(View view) {
428d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    ViewCompat.setLayerType(view, ViewCompat.LAYER_TYPE_HARDWARE, null);
429d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
430d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
431d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationEnd(View view) {
432d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    ViewCompat.setLayerType(view, currentLayerType, null);
433d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    setListener(view, null);
434d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
435d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
436d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                @Override
437d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                public void onAnimationCancel(View view) {
438d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
439d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            });
440d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
441d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
442d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
443d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class JBViewPropertyAnimatorCompatImpl extends ICSViewPropertyAnimatorCompatImpl {
444d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
445d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
446d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withStartAction(View view, Runnable runnable) {
447d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withStartAction(view, runnable);
448d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
449d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
450d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
451d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withEndAction(View view, Runnable runnable) {
452d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withEndAction(view, runnable);
453d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
454d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
455d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
456d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public void withLayer(View view) {
457d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withLayer(view);
458d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
459d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
460d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
461d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class JBMr2ViewPropertyAnimatorCompatImpl extends JBViewPropertyAnimatorCompatImpl {
462d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
463d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
464d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        public Interpolator getInterpolator(View view) {
465d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return (Interpolator) ViewPropertyAnimatorCompatJellybeanMr2.getInterpolator(view);
466d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
467d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
468d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
46949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    static class KitKatViewPropertyAnimatorCompatImpl extends JBMr2ViewPropertyAnimatorCompatImpl {
47049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
47149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        public void setUpdateListener(View view, ViewPropertyAnimatorUpdateListener listener) {
47249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompatKK.setUpdateListener(view, listener);
47349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
47449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
47549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
476d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static final ViewPropertyAnimatorCompatImpl IMPL;
477d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static {
478d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        final int version = android.os.Build.VERSION.SDK_INT;
47949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (version >= 19) {
48049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            IMPL = new KitKatViewPropertyAnimatorCompatImpl();
48149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (version >= 18) {
482d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new JBMr2ViewPropertyAnimatorCompatImpl();
483d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else if (version >= 16) {
484d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new JBViewPropertyAnimatorCompatImpl();
485d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else if (version >= 14) {
486d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new ICSViewPropertyAnimatorCompatImpl();
487d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
488d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new BaseViewPropertyAnimatorCompatImpl();
489d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
490d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
491d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
492d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
493d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the duration for the underlying animator that animates the requested properties.
494d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
495d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
496d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
497d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
498d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
499d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The length of ensuing property animations, in milliseconds. The value
500d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
501d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
502d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
503d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setDuration(long value) {
504d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
505d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
506d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.setDuration(view, value);
507d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
508d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
509d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
510d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
511d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
512d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated to the
513d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
514d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
515d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
516d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
517d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
518d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
519d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
520d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alpha(float value) {
521d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
522d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
523d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.alpha(view, value);
524d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
525d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
526d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
527d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
528d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
529d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated by the
530d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
531d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
532d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
533d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
534d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
535d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
536d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
537d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alphaBy(float value) {
538d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
539d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
540d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.alphaBy(view, value);
541d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
542d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
543d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
544d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
545d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
546d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated to the
547d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
548d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
549d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
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 translationX(float value) {
555d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
556d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
557d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.translationX(view, value);
558d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
559d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
560d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
561d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
562d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
563d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated to the
564d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
565d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
566d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
567d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
568d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
569d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
570d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
571d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationY(float value) {
572d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
573d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
574d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.translationY(view, value);
575d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
576d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
577d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
578d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
579d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
580d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation ends. The action is only
581d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * run if the animation ends normally; if the ViewPropertyAnimator is canceled during
582d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * that animation, the runnable will not run.
583d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withStartAction(Runnable)}, is intended to help facilitate
584d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
585d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
586d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
587d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For example, the following code animates a view to x=200 and then back to 0:</p>
588d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <pre>
589d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     Runnable endAction = new Runnable() {
590d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         public void run() {
591d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *             view.animate().x(0);
592d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         }
593d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     };
594d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     view.animate().x(200).withEndAction(endAction);
595d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * </pre>
596d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
597d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
598d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
599d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
600d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
601d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
602d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
603d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation ends.
604d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
605d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
606d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {
607d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
608d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
609d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.withEndAction(view, runnable);
610d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
611d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
612d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
613d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
614d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
615d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current duration of property animations. If the duration was set on this
616d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
617d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
618d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
619d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return 0.</p>
620d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
621d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setDuration(long)
622d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The duration of animations, in milliseconds.
623d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
624d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getDuration() {
625d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
626d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
627d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return IMPL.getDuration(view);
628d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
629d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
630d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
631d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
632d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
633d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
634d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the interpolator for the underlying animator that animates the requested properties.
635d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default interpolator for ValueAnimator. Calling this method
636d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared object to be used instead.
637d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
638d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
639d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
640d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The TimeInterpolator to be used for ensuing property animations.
641d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
642d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
643d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {
644d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
645d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
646d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.setInterpolator(view, value);
647d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
648d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
649d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
650d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
651d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
652d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the timing interpolator that this animation uses.
653d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
654d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return null.</p>
655d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
656d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The timing interpolator for this animation.
657d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
658d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public Interpolator getInterpolator() {
659d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
660d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
661d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return IMPL.getInterpolator(view);
662d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
663d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        else return null;
664d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
665d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
666d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
667d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the startDelay for the underlying animator that animates the requested properties.
668d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
669d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
670d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
671d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
672d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
673d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The delay of ensuing property animations, in milliseconds. The value
674d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
675d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
676d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
677d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setStartDelay(long value) {
678d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
679d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
680d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.setStartDelay(view, value);
681d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
682d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
683d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
684d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
685d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
686d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current startDelay of property animations. If the startDelay was set on this
687d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
688d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
689d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
690d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return 0.</p>
691d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
692d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setStartDelay(long)
693d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The startDelay of animations, in milliseconds.
694d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
695d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getStartDelay() {
696d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
697d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
698d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return IMPL.getStartDelay(view);
699d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
700d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
701d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
702d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
703d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
704d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
705d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated to the
706d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
707d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
708d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
709d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
710d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
711d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
712d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
713d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotation(float value) {
714d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
715d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
716d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.rotation(view, value);
717d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
718d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
719d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
720d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
721d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
722d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated by the
723d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
724d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
725d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
726d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
727d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
728d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
729d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
730d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationBy(float value) {
731d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
732d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
733d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.rotationBy(view, value);
734d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
735d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
736d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
737d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
738d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
739d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated to the
740d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
741d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
742d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
743d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
744d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
745d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
746d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
747d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationX(float value) {
748d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
749d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
750d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.rotationX(view, value);
751d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
752d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
753d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
754d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
755d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
756d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated by the
757d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
758d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
759d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
760d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
761d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
762d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
763d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
764d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationXBy(float value) {
765d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
766d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
767d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.rotationXBy(view, value);
768d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
769d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
770d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
771d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
772d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
773d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated to the
774d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
775d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
776d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
777d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
778d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
779d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
780d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
781d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationY(float value) {
782d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
783d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
784d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.rotationY(view, value);
785d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
786d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
787d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
788d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
789d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
790d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated by the
791d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
792d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
793d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
794d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
795d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
796d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
797d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
798d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationYBy(float value) {
799d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
800d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
801d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.rotationYBy(view, value);
802d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
803d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
804d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
805d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
806d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
807d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated to the
808d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
809d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
810d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
811d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
812d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
813d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
814d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
815d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleX(float value) {
816d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
817d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
818d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.scaleX(view, value);
819d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
820d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
821d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
822d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
823d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
824d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated by the
825d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
826d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
827d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
828d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
829d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
830d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
831d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
832d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleXBy(float value) {
833d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
834d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
835d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.scaleXBy(view, value);
836d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
837d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
838d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
839d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
840d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
841d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated to the
842d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
843d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
844d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
845d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
846d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
847d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
848d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
849d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleY(float value) {
850d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
851d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
852d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.scaleY(view, value);
853d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
854d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
855d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
856d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
857d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
858d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated by the
859d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
860d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
861d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
862d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
863d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
864d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
865d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
866d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleYBy(float value) {
867d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
868d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
869d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.scaleYBy(view, value);
870d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
871d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
872d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
873d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
874d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
875d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Cancels all property animations that are currently running or pending.
876d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
877d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void cancel() {
878d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
879d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
880d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.cancel(view);
881d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
882d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
883d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
884d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
885d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated to the
886d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
887d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
888d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
889d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
890d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
891d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
892d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
893d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat x(float value) {
894d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
895d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
896d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.x(view, value);
897d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
898d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
899d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
900d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
901d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
902d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated by the
903d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
904d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
905d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
906d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
907d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
908d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
909d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
910d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat xBy(float value) {
911d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
912d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
913d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.xBy(view, value);
914d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
915d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
916d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
917d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
918d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
919d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated to the
920d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
921d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
922d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
923d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
924d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
925d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
926d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
927d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat y(float value) {
928d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
929d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
930d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.y(view, value);
931d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
932d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
933d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
934d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
935d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
936d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated by the
937d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
938d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
939d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
940d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
941d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
942d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
943d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
944d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat yBy(float value) {
945d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
946d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
947d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.yBy(view, value);
948d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
949d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
950d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
951d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
952d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
953d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated by the
954d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
955d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
956d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
957d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
958d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
959d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
960d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
961d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationXBy(float value) {
962d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
963d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
964d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.translationXBy(view, value);
965d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
966d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
967d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
968d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
969d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
970d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated by the
971d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
972d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
973d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
974d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
975d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
976d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
977d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
978d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationYBy(float value) {
979d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
980d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
981d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.translationYBy(view, value);
982d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
983d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
984d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
985d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
986d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
987d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Starts the currently pending property animations immediately. Calling <code>start()</code>
988d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is optional because all animations start automatically at the next opportunity. However,
989d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * if the animations are needed to start immediately and synchronously (not at the time when
990d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the next event is processed by the hierarchy, which is when the animations would begin
991d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * otherwise), then this method can be used.
992d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
993d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
994d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
995d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void start() {
996d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
997d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
998d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.start(view);
999d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1000d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1001d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1002d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1003d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * The View associated with this ViewPropertyAnimator will have its
1004d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#setLayerType(View, int, android.graphics.Paint) layer type} set to
1005d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#LAYER_TYPE_HARDWARE} for the duration of the next animation.
1006d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * As stated in the documentation for {@link ViewCompat#LAYER_TYPE_HARDWARE},
1007d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the actual type of layer used internally depends on the runtime situation of the
1008d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * view. If the activity and this view are hardware-accelerated, then the layer will be
1009d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * accelerated as well. If the activity or the view is not accelerated, then the layer will
1010d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * effectively be the same as {@link ViewCompat#LAYER_TYPE_SOFTWARE}.
1011d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1012d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>This state is not persistent, either on the View or on this ViewPropertyAnimator: the
1013d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * layer type of the View will be restored when the animation ends to what it was when this
1014d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * method was called, and this setting on ViewPropertyAnimator is only valid for the next
1015d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animation. Note that calling this method and then independently setting the layer type of
1016d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the View (by a direct call to
1017d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#setLayerType(View, int, android.graphics.Paint)}) will result in some
1018d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * inconsistency, including having the layer type restored to its pre-withLayer()
1019d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * value when the animation ends.</p>
1020d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1021d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1022d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1023d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
1024d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object, setting a hardware layer in
1025d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method,
1026d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * and then restoring the orignal layer type in the listener's
1027d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
1028d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1029d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see View#setLayerType(int, android.graphics.Paint)
1030d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1031d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1032d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withLayer() {
1033d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1034d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1035d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.withLayer(view);
1036d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1037d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1038d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1039d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1040d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1041d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation runs. If there is a
1042d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link #setStartDelay(long) startDelay} set on this ViewPropertyAnimator, then the
1043d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * action will run after that startDelay expires, when the actual animation begins.
1044d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withEndAction(Runnable)}, is intended to help facilitate
1045d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
1046d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
1047d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1048d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
1049d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1050d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
1051d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
1052d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method.</p>
1053d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1054d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation starts.
1055d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1056d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1057d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {
1058d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1059d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1060d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.withStartAction(view, runnable);
1061d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1062d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1063d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1064d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1065d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1066d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets a listener for events in the underlying Animators that run the property
1067d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animations.
1068d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1069d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1070d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1071d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param listener The listener to be called with AnimatorListener events. A value of
1072d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <code>null</code> removes any existing listener.
1073d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1074d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1075d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setListener(ViewPropertyAnimatorListener listener) {
1076d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1077d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1078d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL.setListener(view, listener);
1079d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1080d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1081d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
108249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
108349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
108449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Sets a listener for update events in the underlying Animator that runs
108549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * the property animations.
108649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
108749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <p>Prior to API 19, this method will do nothing.</p>
108849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
108949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @param listener The listener to be called with update events. A value of
109049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <code>null</code> removes any existing listener.
109149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @return This object, allowing calls to methods in this class to be chained.
109249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
109349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ViewPropertyAnimatorCompat setUpdateListener(
109449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorUpdateListener listener) {
109549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        View view;
109649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((view = mView.get()) != null) {
109749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            IMPL.setUpdateListener(view, listener);
109849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
109949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return this;
110049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
1101d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase}
1102