1990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount/* 2990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Copyright (C) 2016 The Android Open Source Project 3990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * 4990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License"); 5990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * you may not use this file except in compliance with the License. 6990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * You may obtain a copy of the License at 7990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * 8990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * http://www.apache.org/licenses/LICENSE-2.0 9990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * 10990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Unless required by applicable law or agreed to in writing, software 11990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS, 12990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * See the License for the specific language governing permissions and 14990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * limitations under the License. 15990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount */ 16990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountpackage android.support.v4.app; 17990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 18990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.animation.Animator; 19990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.graphics.Rect; 20990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.transition.Transition; 21990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.transition.TransitionValues; 22990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.View; 23990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.ViewGroup; 24990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 25990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport java.util.ArrayList; 26990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 27990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount/** 28990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * A transition that tracks which targets are applied to it. 29990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * It will assume any target that it applies to will have differences 30990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * between the start and end state, regardless of the differences 31990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * that actually exist. In other words, it doesn't actually check 32990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * any size or position differences or any other property of the view. 33990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * It just records the difference. 34990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * <p> 35990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Both start and end value Views are recorded, but no actual animation 36990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * is created. 37990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount */ 38990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountclass TrackingTransition extends Transition implements TargetTracking { 39990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public final ArrayList<View> targets = new ArrayList<>(); 40990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount private final Rect[] mEpicenter = new Rect[1]; 41990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount private static final String PROP = "tracking:prop"; 42990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount private static final String[] PROPS = { PROP }; 43990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 44990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount @Override 45990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public String[] getTransitionProperties() { 46990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount return PROPS; 47990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 48990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 49990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount @Override 50990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public void captureStartValues(TransitionValues transitionValues) { 51990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount transitionValues.values.put(PROP, 0); 52990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 53990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 54990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount @Override 55990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public void captureEndValues(TransitionValues transitionValues) { 56990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount transitionValues.values.put(PROP, 1); 57990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 58990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 59990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount @Override 60990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 61990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount TransitionValues endValues) { 62990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount if (startValues != null) { 63990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount targets.add(startValues.view); 64990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 65990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount if (endValues != null) { 66990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount targets.add(endValues.view); 67990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 68990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount Rect epicenter = getEpicenter(); 69990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount if (epicenter != null) { 70990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount mEpicenter[0] = new Rect(epicenter); 71990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } else { 72990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount mEpicenter[0] = null; 73990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 74990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount return null; 75990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 76990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 77990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount @Override 78990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public ArrayList<View> getTrackedTargets() { 79990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount return targets; 80990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 81990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 82990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount @Override 83990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public void clearTargets() { 84990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount targets.clear(); 85990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 86990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount 87990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount @Override 88990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount public Rect getCapturedEpicenter() { 89990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount return mEpicenter[0]; 90990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount } 91990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount} 92