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