RevealAnimator.java revision d3de42cae84fadfa1befd082a2cf1bf72f9ad82a
14dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui/* 24dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * Copyright (C) 2014 The Android Open Source Project 34dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * 44dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * Licensed under the Apache License, Version 2.0 (the "License"); 54dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * you may not use this file except in compliance with the License. 64dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * You may obtain a copy of the License at 74dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * 84dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * http://www.apache.org/licenses/LICENSE-2.0 94dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * 104dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * Unless required by applicable law or agreed to in writing, software 114dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * distributed under the License is distributed on an "AS IS" BASIS, 124dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * See the License for the specific language governing permissions and 144dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * limitations under the License. 154dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui */ 164dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 174dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghuipackage android.animation; 184dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 19d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reckimport android.view.RenderNodeAnimator; 204dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghuiimport android.view.View; 214dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 224dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui/** 234dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * Reveals a View with an animated clipping circle. 244dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * The clipping is implemented efficiently by talking to a private reveal API on View. 254dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * This hidden class currently only accessed by the {@link android.view.View}. 264dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * 274dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui * @hide 284dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui */ 294dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghuipublic class RevealAnimator extends ValueAnimator { 30d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 31d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private View mClipView; 32d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private int mX, mY; 33d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private boolean mInverseClip; 34d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private float mStartRadius, mEndRadius; 35d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private float mDelta; 36d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private boolean mMayRunAsync; 37d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 38d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // If this is null, we are running on the UI thread driven by the base 39d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // ValueAnimator class. If this is not null, forward requests on to this 40d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // Animator instead. 41d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private RenderNodeAnimator mRtAnimator; 42d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 43d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public RevealAnimator(View clipView, int x, int y, 444dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui float startRadius, float endRadius, boolean inverseClip) { 45d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mClipView = clipView; 46d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mStartRadius = startRadius; 47d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mEndRadius = endRadius; 48d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mDelta = endRadius - startRadius; 49d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mX = x; 50d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mY = y; 51d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mInverseClip = inverseClip; 52d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.setValues(PropertyValuesHolder.ofFloat("radius", startRadius, endRadius)); 534dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 544dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 554dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui @Override 56d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck void animateValue(float fraction) { 57d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.animateValue(fraction); 58d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck fraction = getAnimatedFraction(); 59d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck float radius = mStartRadius + (mDelta * fraction); 60d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mClipView.setRevealClip(true, mInverseClip, mX, mY, radius); 614dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 624dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 634dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui @Override 64d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck protected void endAnimation(AnimationHandler handler) { 65d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mClipView.setRevealClip(false, false, 0, 0, 0); 66d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.endAnimation(handler); 674dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 684dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 694dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui @Override 70d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void setAllowRunningAsynchronously(boolean mayRunAsync) { 71d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mMayRunAsync = mayRunAsync; 724dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 734dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 74d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck private boolean canRunAsync() { 75d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (!mMayRunAsync) { 76d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return false; 77d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 78d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mUpdateListeners != null && mUpdateListeners.size() > 0) { 79d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return false; 80d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 81d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // TODO: Have RNA support this 82d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (getRepeatCount() != 0) { 83d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return false; 84d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 85d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return true; 86d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 874dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 88d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 89d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void start() { 90d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 91d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator.end(); 92d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator = null; 93d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 94d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (canRunAsync()) { 95d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator = new RenderNodeAnimator(mX, mY, mInverseClip, mStartRadius, mEndRadius); 96d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator.setDuration(getDuration()); 97d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator.setInterpolator(getInterpolator()); 98d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator.setTarget(mClipView); 99d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // TODO: Listeners 100d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator.start(); 101d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 102d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.start(); 1034dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 104d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 1054dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 106d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 107d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void cancel() { 108d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 109d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator.cancel(); 110d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 111d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.cancel(); 1124dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 113d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 1144dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 115d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 116d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void end() { 117d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 118d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck mRtAnimator.end(); 119d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 120d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.end(); 1214dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 1224dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 1234dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 124d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 125d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void resume() { 126d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 127d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // TODO: Support? Reject? 128d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 129d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.resume(); 130d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 131d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 1324dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 133d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 134d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void pause() { 135d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 136d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // TODO: see resume() 137d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 138d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.pause(); 139d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 140d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 1414dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 142d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 143d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public boolean isRunning() { 144d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 145d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return mRtAnimator.isRunning(); 146d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 147d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return super.isRunning(); 1484dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 149d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 1504dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 151d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 152d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public boolean isStarted() { 153d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 154d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return mRtAnimator.isStarted(); 155d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 156d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return super.isStarted(); 1574dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 158d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 1594dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui 160d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 161d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void reverse() { 162d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck if (mRtAnimator != null) { 163d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // TODO support 164d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } else { 165d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck super.reverse(); 1664dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 1674dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui } 168d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 169d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 170d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public ValueAnimator clone() { 171d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck RevealAnimator anim = (RevealAnimator) super.clone(); 172d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck anim.mRtAnimator = null; 173d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck return anim; 174d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 175d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 176d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // ---------------------------------------- 177d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // All the things we don't allow 178d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck // ---------------------------------------- 179d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 180d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 181d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void setValues(PropertyValuesHolder... values) { 182d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck throw new IllegalStateException("Cannot change the values of RevealAnimator"); 183d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 184d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 185d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 186d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void setFloatValues(float... values) { 187d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck throw new IllegalStateException("Cannot change the values of RevealAnimator"); 188d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 189d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 190d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 191d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void setIntValues(int... values) { 192d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck throw new IllegalStateException("Cannot change the values of RevealAnimator"); 193d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 194d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 195d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 196d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void setObjectValues(Object... values) { 197d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck throw new IllegalStateException("Cannot change the values of RevealAnimator"); 198d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 199d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck 200d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck @Override 201d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck public void setEvaluator(TypeEvaluator value) { 202d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck throw new IllegalStateException("Cannot change the evaluator of RevealAnimator"); 203d3de42cae84fadfa1befd082a2cf1bf72f9ad82aJohn Reck } 2044dc16b370ca633d6937c8e0ebf9f5aca46baa9a4ztenghui} 205