1ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount/*
2ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * Copyright (C) 2014 The Android Open Source Project
3ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount *
4ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * Licensed under the Apache License, Version 2.0 (the "License");
5ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * you may not use this file except in compliance with the License.
6ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * You may obtain a copy of the License at
7ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount *
8ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount *      http://www.apache.org/licenses/LICENSE-2.0
9ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount *
10ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * Unless required by applicable law or agreed to in writing, software
11ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * distributed under the License is distributed on an "AS IS" BASIS,
12ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * See the License for the specific language governing permissions and
14ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * limitations under the License.
15ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount */
16ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountpackage android.transition;
17ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
18ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.Context;
19ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.graphics.Path;
20ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.util.AttributeSet;
21ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
22ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount/**
23ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * This base class can be extended to provide motion along a Path to Transitions.
24ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount *
25ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * <p>
26ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * Transitions such as {@link android.transition.ChangeBounds} move Views, typically
27ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * in a straight path between the start and end positions. Applications that desire to
28ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * have these motions move in a curve can change how Views interpolate in two dimensions
29ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * by extending PathMotion and implementing {@link #getPath(float, float, float, float)}.
30ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * </p>
31ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * <p>This may be used in XML as an element inside a transition.</p>
32ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * <pre>
33ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * {@code
34ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * &lt;changeBounds>
35ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount *     &lt;pathMotion class="my.app.transition.MyPathMotion"/>
36ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * &lt;/changeBounds>
37ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * }
38ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount * </pre>
39ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount */
40ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountpublic abstract class PathMotion {
41ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
42ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public PathMotion() {}
43ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
44ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public PathMotion(Context context, AttributeSet attrs) {}
45ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
46ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    /**
47ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * Provide a Path to interpolate between two points <code>(startX, startY)</code> and
48ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * <code>(endX, endY)</code>. This allows controlled curved motion along two dimensions.
49ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     *
50ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * @param startX The x coordinate of the starting point.
51ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * @param startY The y coordinate of the starting point.
52ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * @param endX   The x coordinate of the ending point.
53ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * @param endY   The y coordinate of the ending point.
54ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * @return A Path along which the points should be interpolated. The returned Path
55ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * must start at point <code>(startX, startY)</code>, typically using
56ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     * {@link android.graphics.Path#moveTo(float, float)} and end at <code>(endX, endY)</code>.
57ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount     */
58ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public abstract Path getPath(float startX, float startY, float endX, float endY);
59ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount}
60