12dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos/* 22dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * Copyright (C) 2014 The Android Open Source Project 32dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * 42dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * Licensed under the Apache License, Version 2.0 (the "License"); 52dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * you may not use this file except in compliance with the License. 62dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * You may obtain a copy of the License at 72dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * 82dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * http://www.apache.org/licenses/LICENSE-2.0 92dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * 102dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * Unless required by applicable law or agreed to in writing, software 112dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * distributed under the License is distributed on an "AS IS" BASIS, 122dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * See the License for the specific language governing permissions and 142dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * limitations under the License. 152dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos */ 162dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 172dcab18c6c9381122df6e06a93912e53dff69408Paul Soulospackage android.transition; 182dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 192dcab18c6c9381122df6e06a93912e53dff69408Paul Soulosimport android.animation.Animator; 202dcab18c6c9381122df6e06a93912e53dff69408Paul Soulosimport android.animation.ObjectAnimator; 212dcab18c6c9381122df6e06a93912e53dff69408Paul Soulosimport android.content.Context; 222dcab18c6c9381122df6e06a93912e53dff69408Paul Soulosimport android.util.AttributeSet; 232dcab18c6c9381122df6e06a93912e53dff69408Paul Soulosimport android.view.View; 242dcab18c6c9381122df6e06a93912e53dff69408Paul Soulosimport android.view.ViewGroup; 252dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 262dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos/** 272dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * This transition captures the scroll properties of targets before and after 282dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos * the scene change and animates any changes. 292dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos */ 302dcab18c6c9381122df6e06a93912e53dff69408Paul Soulospublic class ChangeScroll extends Transition { 312dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 322dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos private static final String PROPNAME_SCROLL_X = "android:changeScroll:x"; 332dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos private static final String PROPNAME_SCROLL_Y = "android:changeScroll:y"; 342dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 35ae61b85cb595ad157000279e77475900a3f44e05George Mount private static final String[] PROPERTIES = { 36ae61b85cb595ad157000279e77475900a3f44e05George Mount PROPNAME_SCROLL_X, 37ae61b85cb595ad157000279e77475900a3f44e05George Mount PROPNAME_SCROLL_Y, 38ae61b85cb595ad157000279e77475900a3f44e05George Mount }; 39ae61b85cb595ad157000279e77475900a3f44e05George Mount 402dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos public ChangeScroll() {} 412dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 422dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos public ChangeScroll(Context context, AttributeSet attrs) { 432dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos super(context, attrs); 442dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 452dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 462dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos @Override 472dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos public void captureStartValues(TransitionValues transitionValues) { 482dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos captureValues(transitionValues); 492dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 502dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 512dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos @Override 522dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos public void captureEndValues(TransitionValues transitionValues) { 532dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos captureValues(transitionValues); 542dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 552dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 56ae61b85cb595ad157000279e77475900a3f44e05George Mount @Override 57ae61b85cb595ad157000279e77475900a3f44e05George Mount public String[] getTransitionProperties() { 58ae61b85cb595ad157000279e77475900a3f44e05George Mount return PROPERTIES; 59ae61b85cb595ad157000279e77475900a3f44e05George Mount } 60ae61b85cb595ad157000279e77475900a3f44e05George Mount 612dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos private void captureValues(TransitionValues transitionValues) { 622dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos transitionValues.values.put(PROPNAME_SCROLL_X, transitionValues.view.getScrollX()); 632dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos transitionValues.values.put(PROPNAME_SCROLL_Y, transitionValues.view.getScrollY()); 642dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 652dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos 662dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos @Override 672dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 682dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos TransitionValues endValues) { 692dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos if (startValues == null || endValues == null) { 702dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos return null; 712dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 722dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos final View view = endValues.view; 732dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos int startX = (Integer) startValues.values.get(PROPNAME_SCROLL_X); 742dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos int endX = (Integer) endValues.values.get(PROPNAME_SCROLL_X); 752dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos int startY = (Integer) startValues.values.get(PROPNAME_SCROLL_Y); 762dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos int endY = (Integer) endValues.values.get(PROPNAME_SCROLL_Y); 772dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos Animator scrollXAnimator = null; 782dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos Animator scrollYAnimator = null; 792dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos if (startX != endX) { 802dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos view.setScrollX(startX); 812dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos scrollXAnimator = ObjectAnimator.ofInt(view, "scrollX", startX, endX); 822dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 832dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos if (startY != endY) { 842dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos view.setScrollY(startY); 852dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos scrollYAnimator = ObjectAnimator.ofInt(view, "scrollY", startY, endY); 862dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 872dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos return TransitionUtils.mergeAnimators(scrollXAnimator, scrollYAnimator); 882dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos } 892dcab18c6c9381122df6e06a93912e53dff69408Paul Soulos} 90