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