1c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/*
2c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Copyright (C) 2016 The Android Open Source Project
3c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
4c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * you may not use this file except in compliance with the License.
6c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * You may obtain a copy of the License at
7c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
8c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
10c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * See the License for the specific language governing permissions and
14c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * limitations under the License.
15c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
16c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
17c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipackage android.support.transition;
18c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
19c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.animation.Animator;
20c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.os.Build;
21cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Arakiimport android.support.annotation.NonNull;
22cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Arakiimport android.support.annotation.Nullable;
23c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakiimport android.view.ViewGroup;
24c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
25c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki/**
26c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * This transition captures the layout bounds of target views before and after
27c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * the scene change and animates those changes during the transition.
28c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki *
29c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki * <p>Unlike the platform version, this does not support use in XML resources.</p>
30c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki */
31c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Arakipublic class ChangeBounds extends Transition {
32c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
33c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    public ChangeBounds() {
34c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        super(true);
35c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        if (Build.VERSION.SDK_INT < 19) {
36c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            mImpl = new ChangeBoundsIcs(this);
37c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        } else {
38c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki            mImpl = new ChangeBoundsKitKat(this);
39c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        }
40c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
41c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
42c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
43cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public void captureEndValues(@NonNull TransitionValues transitionValues) {
44c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mImpl.captureEndValues(transitionValues);
45c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
46c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
47c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
48cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public void captureStartValues(@NonNull TransitionValues transitionValues) {
49c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        mImpl.captureStartValues(transitionValues);
50c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
51c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
52c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    @Override
53cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    @Nullable
54cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki    public Animator createAnimator(@NonNull ViewGroup sceneRoot,
55cbba0a52f7d7b593dbb13a138515f066f75cce80Yuichi Araki            @NonNull TransitionValues startValues, @NonNull TransitionValues endValues) {
56c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki        return mImpl.createAnimator(sceneRoot, startValues, endValues);
57c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki    }
58c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki
59733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    /**
60733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * When <code>resizeClip</code> is true, ChangeBounds resizes the view using the clipBounds
61733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * instead of changing the dimensions of the view during the animation. When
62733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * <code>resizeClip</code> is false, ChangeBounds resizes the View by changing its dimensions.
63733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
64733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * <p>When resizeClip is set to true, the clip bounds is modified by ChangeBounds. Therefore,
65733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * {@link android.transition.ChangeClipBounds} is not compatible with ChangeBounds
66733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * in this mode.</p>
67733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
68733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param resizeClip Used to indicate whether the view bounds should be modified or the
69733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *                   clip bounds should be modified by ChangeBounds.
70733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @see android.view.View#setClipBounds(android.graphics.Rect)
71733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     */
72733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public void setResizeClip(boolean resizeClip) {
73733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        ((ChangeBoundsInterface) mImpl).setResizeClip(resizeClip);
74733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
75733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
76c876cd8f9334e2423de00836009f3fd7a9566938Yuichi Araki}
77