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