17c608f25d494c8a0a671e7373efbb47ca635367eChet Haase/* 27c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * Copyright (C) 2010 The Android Open Source Project 37c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * 47c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 57c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * you may not use this file except in compliance with the License. 67c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * You may obtain a copy of the License at 77c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * 87c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * http://www.apache.org/licenses/LICENSE-2.0 97c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * 107c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * Unless required by applicable law or agreed to in writing, software 117c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * distributed under the License is distributed on an "AS IS" BASIS, 127c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * See the License for the specific language governing permissions and 147c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * limitations under the License. 157c608f25d494c8a0a671e7373efbb47ca635367eChet Haase */ 167c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 177c608f25d494c8a0a671e7373efbb47ca635367eChet Haasepackage android.animation; 187c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 197c608f25d494c8a0a671e7373efbb47ca635367eChet Haaseimport android.animation.Keyframe.IntKeyframe; 207c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 217c608f25d494c8a0a671e7373efbb47ca635367eChet Haaseimport java.util.ArrayList; 227c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 237c608f25d494c8a0a671e7373efbb47ca635367eChet Haase/** 247c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * This class holds a collection of IntKeyframe objects and is called by ValueAnimator to calculate 257c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * values between those keyframes for a given animation. The class internal to the animation 267c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * package because it is an implementation detail of how Keyframes are stored and used. 277c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * 28b2ab04ffb6894f399d5c9ceb15f64eb17b654426Chet Haase * <p>This type-specific subclass of KeyframeSet, along with the other type-specific subclass for 29b2ab04ffb6894f399d5c9ceb15f64eb17b654426Chet Haase * float, exists to speed up the getValue() method when there is no custom 307c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * TypeEvaluator set for the animation, so that values can be calculated without autoboxing to the 317c608f25d494c8a0a671e7373efbb47ca635367eChet Haase * Object equivalents of these primitive types.</p> 327c608f25d494c8a0a671e7373efbb47ca635367eChet Haase */ 337c608f25d494c8a0a671e7373efbb47ca635367eChet Haaseclass IntKeyframeSet extends KeyframeSet { 347c608f25d494c8a0a671e7373efbb47ca635367eChet Haase private int firstValue; 357c608f25d494c8a0a671e7373efbb47ca635367eChet Haase private int lastValue; 367c608f25d494c8a0a671e7373efbb47ca635367eChet Haase private int deltaValue; 377c608f25d494c8a0a671e7373efbb47ca635367eChet Haase private boolean firstTime = true; 387c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 397c608f25d494c8a0a671e7373efbb47ca635367eChet Haase public IntKeyframeSet(IntKeyframe... keyframes) { 407c608f25d494c8a0a671e7373efbb47ca635367eChet Haase super(keyframes); 417c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 427c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 437c608f25d494c8a0a671e7373efbb47ca635367eChet Haase @Override 447c608f25d494c8a0a671e7373efbb47ca635367eChet Haase public Object getValue(float fraction) { 457c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return getIntValue(fraction); 467c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 477c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 487c608f25d494c8a0a671e7373efbb47ca635367eChet Haase @Override 497c608f25d494c8a0a671e7373efbb47ca635367eChet Haase public IntKeyframeSet clone() { 507c608f25d494c8a0a671e7373efbb47ca635367eChet Haase ArrayList<Keyframe> keyframes = mKeyframes; 517c608f25d494c8a0a671e7373efbb47ca635367eChet Haase int numKeyframes = mKeyframes.size(); 527c608f25d494c8a0a671e7373efbb47ca635367eChet Haase IntKeyframe[] newKeyframes = new IntKeyframe[numKeyframes]; 537c608f25d494c8a0a671e7373efbb47ca635367eChet Haase for (int i = 0; i < numKeyframes; ++i) { 547c608f25d494c8a0a671e7373efbb47ca635367eChet Haase newKeyframes[i] = (IntKeyframe) keyframes.get(i).clone(); 557c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 567c608f25d494c8a0a671e7373efbb47ca635367eChet Haase IntKeyframeSet newSet = new IntKeyframeSet(newKeyframes); 577c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return newSet; 587c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 597c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 607c608f25d494c8a0a671e7373efbb47ca635367eChet Haase public int getIntValue(float fraction) { 617c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (mNumKeyframes == 2) { 627c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (firstTime) { 637c608f25d494c8a0a671e7373efbb47ca635367eChet Haase firstTime = false; 647c608f25d494c8a0a671e7373efbb47ca635367eChet Haase firstValue = ((IntKeyframe) mKeyframes.get(0)).getIntValue(); 657c608f25d494c8a0a671e7373efbb47ca635367eChet Haase lastValue = ((IntKeyframe) mKeyframes.get(1)).getIntValue(); 667c608f25d494c8a0a671e7373efbb47ca635367eChet Haase deltaValue = lastValue - firstValue; 677c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 687c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (mInterpolator != null) { 697c608f25d494c8a0a671e7373efbb47ca635367eChet Haase fraction = mInterpolator.getInterpolation(fraction); 707c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 717c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (mEvaluator == null) { 727c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return firstValue + (int)(fraction * deltaValue); 737c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } else { 747c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return ((Number)mEvaluator.evaluate(fraction, firstValue, lastValue)).intValue(); 757c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 767c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 777c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (fraction <= 0f) { 787c608f25d494c8a0a671e7373efbb47ca635367eChet Haase final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); 797c608f25d494c8a0a671e7373efbb47ca635367eChet Haase final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(1); 807c608f25d494c8a0a671e7373efbb47ca635367eChet Haase int prevValue = prevKeyframe.getIntValue(); 817c608f25d494c8a0a671e7373efbb47ca635367eChet Haase int nextValue = nextKeyframe.getIntValue(); 827c608f25d494c8a0a671e7373efbb47ca635367eChet Haase float prevFraction = prevKeyframe.getFraction(); 837c608f25d494c8a0a671e7373efbb47ca635367eChet Haase float nextFraction = nextKeyframe.getFraction(); 847c608f25d494c8a0a671e7373efbb47ca635367eChet Haase final TimeInterpolator interpolator = nextKeyframe.getInterpolator(); 857c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (interpolator != null) { 867c608f25d494c8a0a671e7373efbb47ca635367eChet Haase fraction = interpolator.getInterpolation(fraction); 877c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 887c608f25d494c8a0a671e7373efbb47ca635367eChet Haase float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); 897c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return mEvaluator == null ? 90750e12e18f7ce9654cadf11b9e933afb29b59311Chet Haase prevValue + (int)(intervalFraction * (nextValue - prevValue)) : 917c608f25d494c8a0a671e7373efbb47ca635367eChet Haase ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). 927c608f25d494c8a0a671e7373efbb47ca635367eChet Haase intValue(); 937c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } else if (fraction >= 1f) { 947c608f25d494c8a0a671e7373efbb47ca635367eChet Haase final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 2); 957c608f25d494c8a0a671e7373efbb47ca635367eChet Haase final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 1); 967c608f25d494c8a0a671e7373efbb47ca635367eChet Haase int prevValue = prevKeyframe.getIntValue(); 977c608f25d494c8a0a671e7373efbb47ca635367eChet Haase int nextValue = nextKeyframe.getIntValue(); 987c608f25d494c8a0a671e7373efbb47ca635367eChet Haase float prevFraction = prevKeyframe.getFraction(); 997c608f25d494c8a0a671e7373efbb47ca635367eChet Haase float nextFraction = nextKeyframe.getFraction(); 1007c608f25d494c8a0a671e7373efbb47ca635367eChet Haase final TimeInterpolator interpolator = nextKeyframe.getInterpolator(); 1017c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (interpolator != null) { 1027c608f25d494c8a0a671e7373efbb47ca635367eChet Haase fraction = interpolator.getInterpolation(fraction); 1037c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 1047c608f25d494c8a0a671e7373efbb47ca635367eChet Haase float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); 1057c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return mEvaluator == null ? 106750e12e18f7ce9654cadf11b9e933afb29b59311Chet Haase prevValue + (int)(intervalFraction * (nextValue - prevValue)) : 1077c608f25d494c8a0a671e7373efbb47ca635367eChet Haase ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)).intValue(); 1087c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 1097c608f25d494c8a0a671e7373efbb47ca635367eChet Haase IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); 1107c608f25d494c8a0a671e7373efbb47ca635367eChet Haase for (int i = 1; i < mNumKeyframes; ++i) { 1117c608f25d494c8a0a671e7373efbb47ca635367eChet Haase IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(i); 1127c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (fraction < nextKeyframe.getFraction()) { 1137c608f25d494c8a0a671e7373efbb47ca635367eChet Haase final TimeInterpolator interpolator = nextKeyframe.getInterpolator(); 1147c608f25d494c8a0a671e7373efbb47ca635367eChet Haase if (interpolator != null) { 1157c608f25d494c8a0a671e7373efbb47ca635367eChet Haase fraction = interpolator.getInterpolation(fraction); 1167c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 1177c608f25d494c8a0a671e7373efbb47ca635367eChet Haase float intervalFraction = (fraction - prevKeyframe.getFraction()) / 1187c608f25d494c8a0a671e7373efbb47ca635367eChet Haase (nextKeyframe.getFraction() - prevKeyframe.getFraction()); 1197c608f25d494c8a0a671e7373efbb47ca635367eChet Haase int prevValue = prevKeyframe.getIntValue(); 1207c608f25d494c8a0a671e7373efbb47ca635367eChet Haase int nextValue = nextKeyframe.getIntValue(); 1217c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return mEvaluator == null ? 122750e12e18f7ce9654cadf11b9e933afb29b59311Chet Haase prevValue + (int)(intervalFraction * (nextValue - prevValue)) : 1237c608f25d494c8a0a671e7373efbb47ca635367eChet Haase ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). 1247c608f25d494c8a0a671e7373efbb47ca635367eChet Haase intValue(); 1257c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 1267c608f25d494c8a0a671e7373efbb47ca635367eChet Haase prevKeyframe = nextKeyframe; 1277c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 1287c608f25d494c8a0a671e7373efbb47ca635367eChet Haase // shouldn't get here 1297c608f25d494c8a0a671e7373efbb47ca635367eChet Haase return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).intValue(); 1307c608f25d494c8a0a671e7373efbb47ca635367eChet Haase } 1317c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 1327c608f25d494c8a0a671e7373efbb47ca635367eChet Haase} 1337c608f25d494c8a0a671e7373efbb47ca635367eChet Haase 134