1642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki/*
2642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Copyright (C) 2017 The Android Open Source Project
3642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *
4642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * you may not use this file except in compliance with the License.
6642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * You may obtain a copy of the License at
7642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *
8642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki *
10642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * See the License for the specific language governing permissions and
14642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * limitations under the License.
15642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki */
16642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
17642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakipackage android.support.transition;
18642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
19642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiimport android.animation.TypeEvaluator;
20642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
21642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki/**
22642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * This evaluator can be used to perform type interpolation between <code>float[]</code> values.
23642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * Each index into the array is treated as a separate value to interpolate. For example,
24642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * evaluating <code>{100, 200}</code> and <code>{300, 400}</code> will interpolate the value at
25642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki * the first index between 100 and 300 and the value at the second index value between 200 and 400.
26642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki */
27642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Arakiclass FloatArrayEvaluator implements TypeEvaluator<float[]> {
28642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
29642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    private float[] mArray;
30642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
31642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    /**
32642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * Create a FloatArrayEvaluator that reuses <code>reuseArray</code> for every evaluate() call.
33642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * Caution must be taken to ensure that the value returned from
34642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * {@link android.animation.ValueAnimator#getAnimatedValue()} is not cached, modified, or
35642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * used across threads. The value will be modified on each <code>evaluate()</code> call.
36642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     *
37642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * @param reuseArray The array to modify and return from <code>evaluate</code>.
38642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     */
39642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    FloatArrayEvaluator(float[] reuseArray) {
40642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki        mArray = reuseArray;
41642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    }
42642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
43642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    /**
44642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * Interpolates the value at each index by the fraction. If
45642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * {@link #FloatArrayEvaluator(float[])} was used to construct this object,
46642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * <code>reuseArray</code> will be returned, otherwise a new <code>float[]</code>
47642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * will be returned.
48642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     *
49642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * @param fraction   The fraction from the starting to the ending values
50642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * @param startValue The start value.
51642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * @param endValue   The end value.
52642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * @return A <code>float[]</code> where each element is an interpolation between
53642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     * the same index in startValue and endValue.
54642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki     */
55642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    @Override
56642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    public float[] evaluate(float fraction, float[] startValue, float[] endValue) {
57642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki        float[] array = mArray;
58642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki        if (array == null) {
59642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki            array = new float[startValue.length];
60642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki        }
61642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
62642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki        for (int i = 0; i < array.length; i++) {
63642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki            float start = startValue[i];
64642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki            float end = endValue[i];
65642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki            array[i] = start + (fraction * (end - start));
66642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki        }
67642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki        return array;
68642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki    }
69642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki
70642a5dcf3012f0f3012324cffe7cb41b602487c7Yuichi Araki}
71