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