ViewPropertyAnimatorCompat.java revision ead7065c8e987fefca4d0d850d824fb7d7bce677
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;
22797c82a7055f7ba825169388465617f0db716739Chet Haaseimport java.util.WeakHashMap;
23d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
24d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haasepublic class ViewPropertyAnimatorCompat {
25d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private static final String TAG = "ViewAnimatorCompat";
26d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    private WeakReference<View> mView;
27ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    private Runnable mStartAction = null;
28ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    private Runnable mEndAction = null;
29ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    private int mOldLayerType = -1;
30ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    // HACK ALERT! Choosing this id knowing that the framework does not use it anywhere
31ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    // internally and apps should use ids higher than it
32ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase    static final int LISTENER_TAG_ID = 0x7e000000;
33ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
34d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
35d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    ViewPropertyAnimatorCompat(View view) {
36d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        mView = new WeakReference<View>(view);
37d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
38d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
39d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    interface ViewPropertyAnimatorCompatImpl {
40ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setDuration(ViewPropertyAnimatorCompat vpa, View view, long value);
41ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getDuration(ViewPropertyAnimatorCompat vpa, View view);
42ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setInterpolator(ViewPropertyAnimatorCompat vpa, View view, Interpolator value);
43ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view);
44ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setStartDelay(ViewPropertyAnimatorCompat vpa, View view, long value);
45ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getStartDelay(ViewPropertyAnimatorCompat vpa, View view);
46ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alpha(ViewPropertyAnimatorCompat vpa, View view, float value);
47ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alphaBy(ViewPropertyAnimatorCompat vpa, View view, float value);
48ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotation(ViewPropertyAnimatorCompat vpa, View view, float value);
49ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationBy(ViewPropertyAnimatorCompat vpa, View view, float value);
50ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationX(ViewPropertyAnimatorCompat vpa, View view, float value);
51ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationXBy(ViewPropertyAnimatorCompat vpa, View view, float value);
52ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationY(ViewPropertyAnimatorCompat vpa, View view, float value);
53ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationYBy(ViewPropertyAnimatorCompat vpa, View view, float value);
54ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleX(ViewPropertyAnimatorCompat vpa, View view, float value);
55ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleXBy(ViewPropertyAnimatorCompat vpa, View view, float value);
56ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleY(ViewPropertyAnimatorCompat vpa, View view, float value);
57ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleYBy(ViewPropertyAnimatorCompat vpa, View view, float value);
58ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void cancel(ViewPropertyAnimatorCompat vpa, View view);
59ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void x(ViewPropertyAnimatorCompat vpa, View view, float value);
60ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void xBy(ViewPropertyAnimatorCompat vpa, View view, float value);
61ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void y(ViewPropertyAnimatorCompat vpa, View view, float value);
62ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void yBy(ViewPropertyAnimatorCompat vpa, View view, float value);
63ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationX(ViewPropertyAnimatorCompat vpa, View view, float value);
64ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationXBy(ViewPropertyAnimatorCompat vpa, View view, float value);
65ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationY(ViewPropertyAnimatorCompat vpa, View view, float value);
66ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationYBy(ViewPropertyAnimatorCompat vpa, View view, float value);
67ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void start(ViewPropertyAnimatorCompat vpa, View view);
68ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view);
69ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable);
70ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable);
71ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view,
72ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener);
73ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view,
74ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorUpdateListener listener);
75d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    };
76d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
77d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class BaseViewPropertyAnimatorCompatImpl implements ViewPropertyAnimatorCompatImpl {
78797c82a7055f7ba825169388465617f0db716739Chet Haase        WeakHashMap<View, Runnable> mStarterMap = null;
79d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
80d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
81ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setDuration(ViewPropertyAnimatorCompat vpa, View view, long value) {
82d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
83d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
84d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
85d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
86ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alpha(ViewPropertyAnimatorCompat vpa, View view, float value) {
87d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
88ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
89d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
90d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
91d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
92ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
93d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
94ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
95d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
96d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
97d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
98ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
99d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
100ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
101d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
102d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
103d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
104ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
105ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mEndAction = runnable;
106ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
107d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
108d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
109d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
110ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getDuration(ViewPropertyAnimatorCompat vpa, View view) {
111d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
112d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
113d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
114d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
115ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setInterpolator(ViewPropertyAnimatorCompat vpa, View view, Interpolator value) {
116d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
117d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
118d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
119d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
120ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view) {
121d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return null;
122d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
123d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
124d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
125ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setStartDelay(ViewPropertyAnimatorCompat vpa, View view, long value) {
126d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
127d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
128d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
129d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
130ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getStartDelay(ViewPropertyAnimatorCompat vpa, View view) {
131d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
132d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
133d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
134d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
135ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alphaBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
136d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
137ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
138d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
139d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
140d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
141ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotation(ViewPropertyAnimatorCompat vpa, View view, float value) {
142d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
143ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
144d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
145d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
146d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
147ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
148d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
149ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
150d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
151d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
152d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
153ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
154d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
155ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
156d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
157d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
158d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
159ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
160d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
161ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
162d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
163d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
164d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
165ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
166d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
167ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
168d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
169d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
170d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
171ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
172d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
173ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
174d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
175d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
176d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
177ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleX(ViewPropertyAnimatorCompat vpa, View view, float value) {
178d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
179ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
180d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
181d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
182d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
183ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
184d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
185ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
186d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
187d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
188d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
189ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleY(ViewPropertyAnimatorCompat vpa, View view, float value) {
190d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
191ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
192d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
193d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
194d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
195ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
196d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
197ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
198d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
199d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
200d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
201ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void cancel(ViewPropertyAnimatorCompat vpa, View view) {
202d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
203ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
204d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
205d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
206d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
207ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void x(ViewPropertyAnimatorCompat vpa, View view, float value) {
208d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
209ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
210d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
211d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
212d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
213ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void xBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
214d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
215ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
216d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
217d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
218d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
219ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void y(ViewPropertyAnimatorCompat vpa, View view, float value) {
220d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
221ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
222d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
223d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
224d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
225ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void yBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
226d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
227ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
228d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
229d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
230d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
231ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
232d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
233ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
234d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
235d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
236d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
237ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
238d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
239ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
240d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
241d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
242d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
243ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void start(ViewPropertyAnimatorCompat vpa, View view) {
244797c82a7055f7ba825169388465617f0db716739Chet Haase            removeStartMessage(view);
245ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            startAnimation(vpa, view);
246d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
247d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
248d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
249ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
250d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            // noop on versions prior to ICS
251d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
252d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
253d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
254ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
255ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mStartAction = runnable;
256ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            postStartMessage(vpa, view);
257d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
258d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
259d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
260ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorListener listener) {
261ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            view.setTag(LISTENER_TAG_ID, listener);
26249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
26349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
26449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
265ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorUpdateListener listener) {
26649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            // noop
267d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
268797c82a7055f7ba825169388465617f0db716739Chet Haase
269ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        private void startAnimation(ViewPropertyAnimatorCompat vpa, View view) {
270ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            Object listenerTag = view.getTag(LISTENER_TAG_ID);
271ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorListener listener = null;
272ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            if (listenerTag instanceof ViewPropertyAnimatorListener) {
273ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                listener = (ViewPropertyAnimatorListener) listenerTag;
274ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            }
275ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            Runnable startAction = vpa.mStartAction;
276ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            Runnable endAction = vpa.mEndAction;
277797c82a7055f7ba825169388465617f0db716739Chet Haase            if (startAction != null) {
278797c82a7055f7ba825169388465617f0db716739Chet Haase                startAction.run();
279797c82a7055f7ba825169388465617f0db716739Chet Haase            }
280797c82a7055f7ba825169388465617f0db716739Chet Haase            if (listener != null) {
281797c82a7055f7ba825169388465617f0db716739Chet Haase                listener.onAnimationStart(view);
282797c82a7055f7ba825169388465617f0db716739Chet Haase                listener.onAnimationEnd(view);
283797c82a7055f7ba825169388465617f0db716739Chet Haase            }
284797c82a7055f7ba825169388465617f0db716739Chet Haase            if (endAction != null) {
285797c82a7055f7ba825169388465617f0db716739Chet Haase                endAction.run();
286797c82a7055f7ba825169388465617f0db716739Chet Haase            }
287797c82a7055f7ba825169388465617f0db716739Chet Haase            if (mStarterMap != null) {
288797c82a7055f7ba825169388465617f0db716739Chet Haase                mStarterMap.remove(view);
289797c82a7055f7ba825169388465617f0db716739Chet Haase            }
290797c82a7055f7ba825169388465617f0db716739Chet Haase        }
291797c82a7055f7ba825169388465617f0db716739Chet Haase
292797c82a7055f7ba825169388465617f0db716739Chet Haase        class Starter implements Runnable {
293797c82a7055f7ba825169388465617f0db716739Chet Haase            WeakReference<View> mViewRef;
294ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompat mVpa;
295797c82a7055f7ba825169388465617f0db716739Chet Haase
296ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            private Starter(ViewPropertyAnimatorCompat vpa, View view) {
297797c82a7055f7ba825169388465617f0db716739Chet Haase                mViewRef = new WeakReference<View>(view);
298ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                mVpa = vpa;
299797c82a7055f7ba825169388465617f0db716739Chet Haase            }
300797c82a7055f7ba825169388465617f0db716739Chet Haase
301797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
302797c82a7055f7ba825169388465617f0db716739Chet Haase            public void run() {
303ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                startAnimation(mVpa, mViewRef.get());
304797c82a7055f7ba825169388465617f0db716739Chet Haase            }
305797c82a7055f7ba825169388465617f0db716739Chet Haase        };
306797c82a7055f7ba825169388465617f0db716739Chet Haase
307797c82a7055f7ba825169388465617f0db716739Chet Haase        private void removeStartMessage(View view) {
308797c82a7055f7ba825169388465617f0db716739Chet Haase            Runnable starter = null;
309797c82a7055f7ba825169388465617f0db716739Chet Haase            if (mStarterMap != null) {
310797c82a7055f7ba825169388465617f0db716739Chet Haase                starter = mStarterMap.get(view);
311797c82a7055f7ba825169388465617f0db716739Chet Haase                if (starter != null) {
312797c82a7055f7ba825169388465617f0db716739Chet Haase                    view.removeCallbacks(starter);
313797c82a7055f7ba825169388465617f0db716739Chet Haase                }
314797c82a7055f7ba825169388465617f0db716739Chet Haase            }
315797c82a7055f7ba825169388465617f0db716739Chet Haase        }
316797c82a7055f7ba825169388465617f0db716739Chet Haase
317ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        private void postStartMessage(ViewPropertyAnimatorCompat vpa, View view) {
318797c82a7055f7ba825169388465617f0db716739Chet Haase            Runnable starter = null;
319797c82a7055f7ba825169388465617f0db716739Chet Haase            if (mStarterMap != null) {
320797c82a7055f7ba825169388465617f0db716739Chet Haase                starter = mStarterMap.get(view);
321797c82a7055f7ba825169388465617f0db716739Chet Haase            }
322797c82a7055f7ba825169388465617f0db716739Chet Haase            if (starter == null) {
323ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                starter = new Starter(vpa, view);
324797c82a7055f7ba825169388465617f0db716739Chet Haase                if (mStarterMap == null) {
325797c82a7055f7ba825169388465617f0db716739Chet Haase                    mStarterMap = new WeakHashMap<View, Runnable>();
326797c82a7055f7ba825169388465617f0db716739Chet Haase                }
327797c82a7055f7ba825169388465617f0db716739Chet Haase                mStarterMap.put(view, starter);
328797c82a7055f7ba825169388465617f0db716739Chet Haase            }
329797c82a7055f7ba825169388465617f0db716739Chet Haase            view.removeCallbacks(starter);
330797c82a7055f7ba825169388465617f0db716739Chet Haase            view.post(starter);
331797c82a7055f7ba825169388465617f0db716739Chet Haase        }
332797c82a7055f7ba825169388465617f0db716739Chet Haase
333d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
334d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
335d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class ICSViewPropertyAnimatorCompatImpl extends BaseViewPropertyAnimatorCompatImpl {
336797c82a7055f7ba825169388465617f0db716739Chet Haase        WeakHashMap<View, Integer> mLayerMap = null;
337d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
338d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
339ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setDuration(ViewPropertyAnimatorCompat vpa, View view, long value) {
340d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setDuration(view, value);
341d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
342d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
343d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
344ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alpha(ViewPropertyAnimatorCompat vpa, View view, float value) {
345d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.alpha(view, value);
346d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
347d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
348d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
349ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
350d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationX(view, value);
351d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
352d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
353d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
354ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
355d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationY(view, value);
356d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
357d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
358d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
359ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getDuration(ViewPropertyAnimatorCompat vpa, View view) {
360d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return ViewPropertyAnimatorCompatICS.getDuration(view);
361d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
362d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
363d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
364ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setInterpolator(ViewPropertyAnimatorCompat vpa, View view, Interpolator value) {
365d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setInterpolator(view, value);
366d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
367d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
368d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
369ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setStartDelay(ViewPropertyAnimatorCompat vpa, View view, long value) {
370d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.setStartDelay(view, value);
371d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
372d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
373d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
374ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public long getStartDelay(ViewPropertyAnimatorCompat vpa, View view) {
375d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return ViewPropertyAnimatorCompatICS.getStartDelay(view);
376d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
377d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
378d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
379ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void alphaBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
380d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.alphaBy(view, value);
381d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
382d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
383d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
384ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotation(ViewPropertyAnimatorCompat vpa, View view, float value) {
385d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotation(view, value);
386d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
387d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
388d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
389ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
390d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationBy(view, value);
391d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
392d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
393d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
394ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationX(ViewPropertyAnimatorCompat vpa, View view, float value) {
395d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationX(view, value);
396d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
397d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
398d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
399ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
400d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationXBy(view, value);
401d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
402d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
403d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
404ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationY(ViewPropertyAnimatorCompat vpa, View view, float value) {
405d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationY(view, value);
406d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
407d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
408d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
409ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void rotationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
410d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.rotationYBy(view, value);
411d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
412d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
413d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
414ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleX(ViewPropertyAnimatorCompat vpa, View view, float value) {
415d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleX(view, value);
416d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
417d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
418d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
419ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
420d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleXBy(view, value);
421d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
422d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
423d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
424ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleY(ViewPropertyAnimatorCompat vpa, View view, float value) {
425d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleY(view, value);
426d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
427d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
428d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
429ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void scaleYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
430d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.scaleYBy(view, value);
431d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
432d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
433d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
434ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void cancel(ViewPropertyAnimatorCompat vpa, View view) {
435d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.cancel(view);
436d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
437d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
438d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
439ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void x(ViewPropertyAnimatorCompat vpa, View view, float value) {
440d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.x(view, value);
441d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
442d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
443d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
444ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void xBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
445d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.xBy(view, value);
446d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
447d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
448d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
449ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void y(ViewPropertyAnimatorCompat vpa, View view, float value) {
450d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.y(view, value);
451d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
452d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
453d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
454ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void yBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
455d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.yBy(view, value);
456d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
457d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
458d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
459ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationXBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
460d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationXBy(view, value);
461d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
462d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
463d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
464ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void translationYBy(ViewPropertyAnimatorCompat vpa, View view, float value) {
465d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.translationYBy(view, value);
466d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
467d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
468d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
469ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void start(ViewPropertyAnimatorCompat vpa, View view) {
470d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatICS.start(view);
471d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
472d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
473d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
474ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorListener listener) {
475ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            view.setTag(LISTENER_TAG_ID, listener);
476ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
477d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
478d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
479d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
480ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, final Runnable runnable) {
481ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
482ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mEndAction = runnable;
483d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
484d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
485d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
486ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, final Runnable runnable) {
487ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
488ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mStartAction = runnable;
489d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
490d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
491d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
492ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
493ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            vpa.mOldLayerType = ViewCompat.getLayerType(view);
494ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatICS.setListener(view, new MyVpaListener(vpa));
495797c82a7055f7ba825169388465617f0db716739Chet Haase        }
496797c82a7055f7ba825169388465617f0db716739Chet Haase
497ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        static class MyVpaListener implements ViewPropertyAnimatorListener {
498ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
499ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompat mVpa;
500ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
501ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            MyVpaListener(ViewPropertyAnimatorCompat vpa) {
502ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                mVpa = vpa;
503ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            }
504ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
505797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
506797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationStart(View view) {
507ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mOldLayerType >= 0) {
508d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                    ViewCompat.setLayerType(view, ViewCompat.LAYER_TYPE_HARDWARE, null);
509d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
510ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mStartAction != null) {
511ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    mVpa.mStartAction.run();
512ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
513ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                Object listenerTag = view.getTag(LISTENER_TAG_ID);
514ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener = null;
515ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (listenerTag instanceof ViewPropertyAnimatorListener) {
516ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    listener = (ViewPropertyAnimatorListener) listenerTag;
517797c82a7055f7ba825169388465617f0db716739Chet Haase                }
518797c82a7055f7ba825169388465617f0db716739Chet Haase                if (listener != null) {
519797c82a7055f7ba825169388465617f0db716739Chet Haase                    listener.onAnimationStart(view);
520797c82a7055f7ba825169388465617f0db716739Chet Haase                }
521797c82a7055f7ba825169388465617f0db716739Chet Haase            }
522ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
523797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
524797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationEnd(View view) {
525ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mOldLayerType >= 0) {
526ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    ViewCompat.setLayerType(view, mVpa.mOldLayerType, null);
527ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    mVpa.mOldLayerType = -1;
528ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
529ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (mVpa.mEndAction != null) {
530ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    mVpa.mEndAction.run();
531ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
532ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                Object listenerTag = view.getTag(LISTENER_TAG_ID);
533ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener = null;
534ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (listenerTag instanceof ViewPropertyAnimatorListener) {
535ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    listener = (ViewPropertyAnimatorListener) listenerTag;
536797c82a7055f7ba825169388465617f0db716739Chet Haase                }
537797c82a7055f7ba825169388465617f0db716739Chet Haase                if (listener != null) {
538797c82a7055f7ba825169388465617f0db716739Chet Haase                    listener.onAnimationEnd(view);
539797c82a7055f7ba825169388465617f0db716739Chet Haase                }
540797c82a7055f7ba825169388465617f0db716739Chet Haase            }
541d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
542797c82a7055f7ba825169388465617f0db716739Chet Haase            @Override
543797c82a7055f7ba825169388465617f0db716739Chet Haase            public void onAnimationCancel(View view) {
544ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                Object listenerTag = view.getTag(LISTENER_TAG_ID);
545ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                ViewPropertyAnimatorListener listener = null;
546ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                if (listenerTag instanceof ViewPropertyAnimatorListener) {
547ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                    listener = (ViewPropertyAnimatorListener) listenerTag;
548ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase                }
549797c82a7055f7ba825169388465617f0db716739Chet Haase                if (listener != null) {
550797c82a7055f7ba825169388465617f0db716739Chet Haase                    listener.onAnimationCancel(view);
551d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase                }
552797c82a7055f7ba825169388465617f0db716739Chet Haase            }
553797c82a7055f7ba825169388465617f0db716739Chet Haase        };
554d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
555d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
556d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class JBViewPropertyAnimatorCompatImpl extends ICSViewPropertyAnimatorCompatImpl {
557d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
558d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
559ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorListener listener) {
560ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            ViewPropertyAnimatorCompatJB.setListener(view, listener);
561ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        }
562ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase
563ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        @Override
564ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withStartAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
565d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withStartAction(view, runnable);
566d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
567d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
568d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
569ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withEndAction(ViewPropertyAnimatorCompat vpa, View view, Runnable runnable) {
570d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withEndAction(view, runnable);
571d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
572d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
573d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
574ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void withLayer(ViewPropertyAnimatorCompat vpa, View view) {
575d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            ViewPropertyAnimatorCompatJB.withLayer(view);
576d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
577d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
578d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
579d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static class JBMr2ViewPropertyAnimatorCompatImpl extends JBViewPropertyAnimatorCompatImpl {
580d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
581d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        @Override
582ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public Interpolator getInterpolator(ViewPropertyAnimatorCompat vpa, View view) {
583d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return (Interpolator) ViewPropertyAnimatorCompatJellybeanMr2.getInterpolator(view);
584d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
585d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
586d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
58749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    static class KitKatViewPropertyAnimatorCompatImpl extends JBMr2ViewPropertyAnimatorCompatImpl {
58849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        @Override
589ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase        public void setUpdateListener(ViewPropertyAnimatorCompat vpa, View view, ViewPropertyAnimatorUpdateListener listener) {
59049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorCompatKK.setUpdateListener(view, listener);
59149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
59249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
59349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
594d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static final ViewPropertyAnimatorCompatImpl IMPL;
595d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    static {
596d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        final int version = android.os.Build.VERSION.SDK_INT;
59749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if (version >= 19) {
59849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            IMPL = new KitKatViewPropertyAnimatorCompatImpl();
59949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        } else if (version >= 18) {
600d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new JBMr2ViewPropertyAnimatorCompatImpl();
601d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else if (version >= 16) {
602d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new JBViewPropertyAnimatorCompatImpl();
603d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else if (version >= 14) {
604d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new ICSViewPropertyAnimatorCompatImpl();
605d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
606d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            IMPL = new BaseViewPropertyAnimatorCompatImpl();
607d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
608d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
609d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
610d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
611d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the duration for the underlying animator that animates the requested properties.
612d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
613d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
614d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
615d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
616d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
617d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The length of ensuing property animations, in milliseconds. The value
618d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
619d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
620d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
621d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setDuration(long value) {
622d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
623d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
624ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setDuration(this, view, value);
625d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
626d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
627d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
628d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
629d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
630d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated to the
631d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
632d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
633d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
634d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
635d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
636d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
637d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
638d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alpha(float value) {
639d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
640d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
641ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.alpha(this, view, value);
642d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
643d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
644d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
645d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
646d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
647d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>alpha</code> property to be animated by the
648d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
649d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
650d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
651d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
652d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
653d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
654d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
655d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat alphaBy(float value) {
656d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
657d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
658ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.alphaBy(this, view, value);
659d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
660d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
661d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
662d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
663d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
664d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated to the
665d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
666d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
667d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
668d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
669d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
670d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
671d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
672d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationX(float value) {
673d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
674d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
675ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationX(this, view, value);
676d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
677d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
678d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
679d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
680d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
681d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated to the
682d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
683d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
684d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
685d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
686d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
687d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
688d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
689d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationY(float value) {
690d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
691d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
692ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationY(this, view, value);
693d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
694d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
695d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
696d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
697d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
698d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation ends. The action is only
699d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * run if the animation ends normally; if the ViewPropertyAnimator is canceled during
700d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * that animation, the runnable will not run.
701d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withStartAction(Runnable)}, is intended to help facilitate
702d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
703d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
704d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
705d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For example, the following code animates a view to x=200 and then back to 0:</p>
706d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <pre>
707d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     Runnable endAction = new Runnable() {
708d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         public void run() {
709d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *             view.animate().x(0);
710d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *         }
711d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     };
712d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *     view.animate().x(200).withEndAction(endAction);
713d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * </pre>
714d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
715d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
716d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
717d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
718d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
719d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
720d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
721d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation ends.
722d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
723d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
724d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {
725d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
726d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
727ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withEndAction(this, view, runnable);
728d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
729d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
730d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
731d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
732d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
733d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current duration of property animations. If the duration was set on this
734d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
735d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
736d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
737d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return 0.</p>
738d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
739d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setDuration(long)
740d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The duration of animations, in milliseconds.
741d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
742d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getDuration() {
743d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
744d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
745ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            return IMPL.getDuration(this, view);
746d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
747d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
748d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
749d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
750d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
751d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
752d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the interpolator for the underlying animator that animates the requested properties.
753d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default interpolator for ValueAnimator. Calling this method
754d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared object to be used instead.
755d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
756d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
757d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
758d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The TimeInterpolator to be used for ensuing property animations.
759d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
760d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
761d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {
762d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
763d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
764ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setInterpolator(this, view, value);
765d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
766d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
767d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
768d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
769d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
770d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the timing interpolator that this animation uses.
771d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
772d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return null.</p>
773d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
774d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The timing interpolator for this animation.
775d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
776d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public Interpolator getInterpolator() {
777d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
778d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
779ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            return IMPL.getInterpolator(this, view);
780d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
781d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        else return null;
782d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
783d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
784d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
785d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets the startDelay for the underlying animator that animates the requested properties.
786d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * By default, the animator uses the default value for ValueAnimator. Calling this method
787d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * will cause the declared value to be used instead.
788d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
789d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
790d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
791d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The delay of ensuing property animations, in milliseconds. The value
792d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * cannot be negative.
793d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
794d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
795d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setStartDelay(long value) {
796d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
797d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
798ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setStartDelay(this, view, value);
799d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
800d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
801d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
802d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
803d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
804d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Returns the current startDelay of property animations. If the startDelay was set on this
805d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * object, that value is returned. Otherwise, the default value of the underlying Animator
806d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is returned.
807d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
808d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will return 0.</p>
809d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
810d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see #setStartDelay(long)
811d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return The startDelay of animations, in milliseconds.
812d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
813d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public long getStartDelay() {
814d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
815d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
816ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            return IMPL.getStartDelay(this, view);
817d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        } else {
818d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase            return 0;
819d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
820d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
821d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
822d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
823d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated to the
824d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
825d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
826d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
827d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
828d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
829d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
830d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
831d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotation(float value) {
832d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
833d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
834ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotation(this, view, value);
835d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
836d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
837d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
838d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
839d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
840d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotation</code> property to be animated by the
841d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
842d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
843d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
844d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
845d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
846d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
847d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
848d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationBy(float value) {
849d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
850d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
851ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationBy(this, view, value);
852d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
853d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
854d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
855d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
856d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
857d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated to the
858d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
859d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
860d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
861d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
862d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
863d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
864d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
865d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationX(float value) {
866d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
867d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
868ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationX(this, view, value);
869d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
870d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
871d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
872d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
873d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
874d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationX</code> property to be animated by the
875d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
876d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
877d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
878d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
879d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
880d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
881d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
882d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationXBy(float value) {
883d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
884d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
885ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationXBy(this, view, value);
886d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
887d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
888d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
889d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
890d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
891d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated to the
892d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
893d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
894d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
895d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
896d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
897d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
898d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
899d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationY(float value) {
900d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
901d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
902ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationY(this, view, value);
903d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
904d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
905d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
906d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
907d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
908d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>rotationY</code> property to be animated by the
909d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
910d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
911d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
912d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
913d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
914d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
915d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
916d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat rotationYBy(float value) {
917d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
918d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
919ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.rotationYBy(this, view, value);
920d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
921d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
922d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
923d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
924d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
925d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated to the
926d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
927d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
928d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
929d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
930d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
931d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
932d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
933d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleX(float value) {
934d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
935d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
936ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleX(this, view, value);
937d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
938d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
939d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
940d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
941d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
942d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleX</code> property to be animated by the
943d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
944d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
945d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
946d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
947d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
948d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
949d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
950d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleXBy(float value) {
951d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
952d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
953ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleXBy(this, view, value);
954d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
955d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
956d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
957d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
958d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
959d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated to the
960d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
961d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
962d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
963d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
964d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
965d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
966d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
967d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleY(float value) {
968d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
969d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
970ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleY(this, view, value);
971d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
972d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
973d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
974d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
975d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
976d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>scaleY</code> property to be animated by the
977d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
978d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
979d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
980d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
981d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
982d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
983d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
984d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat scaleYBy(float value) {
985d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
986d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
987ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.scaleYBy(this, view, value);
988d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
989d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
990d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
991d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
992d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
993d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Cancels all property animations that are currently running or pending.
994d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
995d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void cancel() {
996d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
997d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
998ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.cancel(this, view);
999d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1000d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1001d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1002d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1003d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated to the
1004d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1005d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1006d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1007d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1008d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
1009d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1010d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1011d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat x(float value) {
1012d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1013d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1014ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.x(this, view, value);
1015d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1016d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1017d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1018d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1019d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1020d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>x</code> property to be animated by the
1021d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1022d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1023d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1024d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1025d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1026d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1027d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1028d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat xBy(float value) {
1029d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1030d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1031ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.xBy(this, view, value);
1032d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1033d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1034d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1035d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1036d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1037d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated to the
1038d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1039d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1040d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1041d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1042d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The value to be animated to.
1043d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1044d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1045d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat y(float value) {
1046d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1047d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1048ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.y(this, view, value);
1049d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1050d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1051d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1052d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1053d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1054d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>y</code> property to be animated by the
1055d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1056d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1057d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1058d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1059d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1060d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1061d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1062d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat yBy(float value) {
1063d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1064d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1065ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.yBy(this, view, value);
1066d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1067d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1068d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1069d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1070d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1071d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationX</code> property to be animated by the
1072d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1073d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1074d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1075d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1076d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1077d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1078d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1079d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationXBy(float value) {
1080d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1081d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1082ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationXBy(this, view, value);
1083d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1084d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1085d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1086d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1087d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1088d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method will cause the View's <code>translationY</code> property to be animated by the
1089d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * specified value. Animations already running on the property will be canceled.
1090d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1091d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1092d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1093d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param value The amount to be animated by, as an offset from the current value.
1094d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1095d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1096d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat translationYBy(float value) {
1097d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1098d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1099ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.translationYBy(this, view, value);
1100d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1101d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1102d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1103d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1104d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1105d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Starts the currently pending property animations immediately. Calling <code>start()</code>
1106d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * is optional because all animations start automatically at the next opportunity. However,
1107d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * if the animations are needed to start immediately and synchronously (not at the time when
1108d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the next event is processed by the hierarchy, which is when the animations would begin
1109d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * otherwise), then this method can be used.
1110d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1111d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1112d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1113d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public void start() {
1114d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1115d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1116ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.start(this, view);
1117d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1118d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1119d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1120d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1121d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * The View associated with this ViewPropertyAnimator will have its
1122d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#setLayerType(View, int, android.graphics.Paint) layer type} set to
1123d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#LAYER_TYPE_HARDWARE} for the duration of the next animation.
1124d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * As stated in the documentation for {@link ViewCompat#LAYER_TYPE_HARDWARE},
1125d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the actual type of layer used internally depends on the runtime situation of the
1126d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * view. If the activity and this view are hardware-accelerated, then the layer will be
1127d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * accelerated as well. If the activity or the view is not accelerated, then the layer will
1128d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * effectively be the same as {@link ViewCompat#LAYER_TYPE_SOFTWARE}.
1129d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1130d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>This state is not persistent, either on the View or on this ViewPropertyAnimator: the
1131d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * layer type of the View will be restored when the animation ends to what it was when this
1132d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * method was called, and this setting on ViewPropertyAnimator is only valid for the next
1133d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animation. Note that calling this method and then independently setting the layer type of
1134d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the View (by a direct call to
1135d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewCompat#setLayerType(View, int, android.graphics.Paint)}) will result in some
1136d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * inconsistency, including having the layer type restored to its pre-withLayer()
1137d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * value when the animation ends.</p>
1138d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1139d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1140d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1141d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
1142d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object, setting a hardware layer in
1143d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * the listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method,
1144d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * and then restoring the orignal layer type in the listener's
1145d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link ViewPropertyAnimatorListener#onAnimationEnd(View)} method.</p>
1146d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1147d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @see View#setLayerType(int, android.graphics.Paint)
1148d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1149d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1150d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withLayer() {
1151d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1152d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1153ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withLayer(this, view);
1154d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1155d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1156d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1157d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1158d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1159d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Specifies an action to take place when the next animation runs. If there is a
1160d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * {@link #setStartDelay(long) startDelay} set on this ViewPropertyAnimator, then the
1161d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * action will run after that startDelay expires, when the actual animation begins.
1162d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * This method, along with {@link #withEndAction(Runnable)}, is intended to help facilitate
1163d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * choreographing ViewPropertyAnimator animations with other animations or actions
1164d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in the application.
1165d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1166d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will run the action immediately.</p>
1167d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1168d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>For API 14 and 15, this method will run by setting
1169d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * a listener on the ViewPropertyAnimatorCompat object and running the action
1170d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * in that listener's {@link ViewPropertyAnimatorListener#onAnimationStart(View)} method.</p>
1171d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1172d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param runnable The action to run when the next animation starts.
1173d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1174d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1175d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {
1176d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1177d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1178ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.withStartAction(this, view, runnable);
1179d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1180d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1181d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
1182d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase
1183d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    /**
1184d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * Sets a listener for events in the underlying Animators that run the property
1185d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * animations.
1186d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1187d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <p>Prior to API 14, this method will do nothing.</p>
1188d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     *
1189d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @param listener The listener to be called with AnimatorListener events. A value of
1190d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * <code>null</code> removes any existing listener.
1191d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     * @return This object, allowing calls to methods in this class to be chained.
1192d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase     */
1193d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    public ViewPropertyAnimatorCompat setListener(ViewPropertyAnimatorListener listener) {
1194d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        View view;
1195d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        if ((view = mView.get()) != null) {
1196ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setListener(this, view, listener);
1197d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        }
1198d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase        return this;
1199d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase    }
120049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes
120149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    /**
120249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * Sets a listener for update events in the underlying Animator that runs
120349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * the property animations.
120449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
120549c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <p>Prior to API 19, this method will do nothing.</p>
120649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     *
120749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @param listener The listener to be called with update events. A value of
120849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * <code>null</code> removes any existing listener.
120949c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     * @return This object, allowing calls to methods in this class to be chained.
121049c78900da0d43140fb602431fb93212bd7f6c70Chris Banes     */
121149c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    public ViewPropertyAnimatorCompat setUpdateListener(
121249c78900da0d43140fb602431fb93212bd7f6c70Chris Banes            ViewPropertyAnimatorUpdateListener listener) {
121349c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        View view;
121449c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        if ((view = mView.get()) != null) {
1215ead7065c8e987fefca4d0d850d824fb7d7bce677Chet Haase            IMPL.setUpdateListener(this, view, listener);
121649c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        }
121749c78900da0d43140fb602431fb93212bd7f6c70Chris Banes        return this;
121849c78900da0d43140fb602431fb93212bd7f6c70Chris Banes    }
1219d7d27e9ebe5c7325e67e1a8af265378bd2056cadChet Haase}
1220