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