1913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki/* 2913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * Copyright (C) 2017 The Android Open Source Project 3913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * 4913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License"); 5913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * you may not use this file except in compliance with the License. 6913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * You may obtain a copy of the License at 7913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * 8913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * http://www.apache.org/licenses/LICENSE-2.0 9913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * 10913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * Unless required by applicable law or agreed to in writing, software 11913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS, 12913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * See the License for the specific language governing permissions and 14913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * limitations under the License. 15913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki */ 16913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 17913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakipackage android.support.transition; 18913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 19913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.animation.Animator; 20913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.animation.ObjectAnimator; 21913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.content.Context; 22913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.support.annotation.NonNull; 23913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.support.annotation.Nullable; 24913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.util.AttributeSet; 25913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.view.View; 26913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakiimport android.view.ViewGroup; 27913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 28913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 29913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki/** 30913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * This transition captures the scroll properties of targets before and after 31913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki * the scene change and animates any changes. 32913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki */ 33913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Arakipublic class ChangeScroll extends Transition { 34913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 35913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki private static final String PROPNAME_SCROLL_X = "android:changeScroll:x"; 36913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki private static final String PROPNAME_SCROLL_Y = "android:changeScroll:y"; 37913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 38913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki private static final String[] PROPERTIES = { 39913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki PROPNAME_SCROLL_X, 40913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki PROPNAME_SCROLL_Y, 41913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki }; 42913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 43913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki public ChangeScroll() {} 44913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 45913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki public ChangeScroll(Context context, AttributeSet attrs) { 46913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki super(context, attrs); 47913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 48913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 49913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki @Override 50913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki public void captureStartValues(@NonNull TransitionValues transitionValues) { 51913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki captureValues(transitionValues); 52913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 53913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 54913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki @Override 55913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki public void captureEndValues(@NonNull TransitionValues transitionValues) { 56913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki captureValues(transitionValues); 57913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 58913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 59913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki @Nullable 60913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki @Override 61913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki public String[] getTransitionProperties() { 62913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki return PROPERTIES; 63913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 64913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 65913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki private void captureValues(TransitionValues transitionValues) { 66913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki transitionValues.values.put(PROPNAME_SCROLL_X, transitionValues.view.getScrollX()); 67913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki transitionValues.values.put(PROPNAME_SCROLL_Y, transitionValues.view.getScrollY()); 68913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 69913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 70913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki @Nullable 71913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki @Override 72913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki public Animator createAnimator(@NonNull ViewGroup sceneRoot, 73913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki @Nullable TransitionValues startValues, @Nullable TransitionValues endValues) { 74913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki if (startValues == null || endValues == null) { 75913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki return null; 76913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 77913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki final View view = endValues.view; 78913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki int startX = (Integer) startValues.values.get(PROPNAME_SCROLL_X); 79913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki int endX = (Integer) endValues.values.get(PROPNAME_SCROLL_X); 80913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki int startY = (Integer) startValues.values.get(PROPNAME_SCROLL_Y); 81913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki int endY = (Integer) endValues.values.get(PROPNAME_SCROLL_Y); 82913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki Animator scrollXAnimator = null; 83913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki Animator scrollYAnimator = null; 84913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki if (startX != endX) { 85913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki view.setScrollX(startX); 86913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki scrollXAnimator = ObjectAnimator.ofInt(view, "scrollX", startX, endX); 87913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 88913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki if (startY != endY) { 89913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki view.setScrollY(startY); 90913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki scrollYAnimator = ObjectAnimator.ofInt(view, "scrollY", startY, endY); 91913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 92913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki return TransitionUtils.mergeAnimators(scrollXAnimator, scrollYAnimator); 93913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki } 94913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki 95913cfb35ee8a1fc3223c4f98bd1e22182b035186Yuichi Araki} 96