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