1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.view.animation.cts; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertFalse; 21 import static org.junit.Assert.assertTrue; 22 23 import android.app.Activity; 24 import android.app.Instrumentation; 25 import android.content.res.XmlResourceParser; 26 import android.support.test.InstrumentationRegistry; 27 import android.support.test.filters.MediumTest; 28 import android.support.test.rule.ActivityTestRule; 29 import android.support.test.runner.AndroidJUnit4; 30 import android.util.AttributeSet; 31 import android.util.Xml; 32 import android.view.View; 33 import android.view.animation.AlphaAnimation; 34 import android.view.animation.Animation; 35 import android.view.animation.AnimationUtils; 36 import android.view.animation.DecelerateInterpolator; 37 import android.view.animation.Interpolator; 38 import android.view.animation.Transformation; 39 import android.view.cts.R; 40 41 import org.junit.Before; 42 import org.junit.Rule; 43 import org.junit.Test; 44 import org.junit.runner.RunWith; 45 46 /** 47 * Test {@link DecelerateInterpolator}. 48 */ 49 @MediumTest 50 @RunWith(AndroidJUnit4.class) 51 public class DecelerateInterpolatorTest { 52 private static final float ALPHA_DELTA = 0.001f; 53 54 /** It is defined in R.anim.decelerate_alpha */ 55 private static final long DECELERATE_ALPHA_DURATION = 2000; 56 57 private Instrumentation mInstrumentation; 58 private Activity mActivity; 59 60 @Rule 61 public ActivityTestRule<AnimationTestCtsActivity> mActivityRule = 62 new ActivityTestRule<>(AnimationTestCtsActivity.class); 63 64 @Before 65 public void setup() { 66 mInstrumentation = InstrumentationRegistry.getInstrumentation(); 67 mActivity = mActivityRule.getActivity(); 68 } 69 70 @Test 71 public void testConstructor() { 72 new DecelerateInterpolator(); 73 74 new DecelerateInterpolator(1.0f); 75 76 XmlResourceParser parser = mActivity.getResources().getAnimation(R.anim.decelerate_alpha); 77 AttributeSet attrs = Xml.asAttributeSet(parser); 78 new DecelerateInterpolator(mActivity, attrs); 79 } 80 81 @Test 82 public void testDecelerateInterpolator() throws Throwable { 83 final View animWindow = mActivity.findViewById(R.id.anim_window); 84 85 // XML file of R.anim.decelerate_alpha 86 // <alpha xmlns:android="http://schemas.android.com/apk/res/android" 87 // android:interpolator="@android:anim/decelerate_interpolator" 88 // android:fromAlpha="0.0" 89 // android:toAlpha="1.0" 90 // android:duration="2000" /> 91 final Animation anim = AnimationUtils.loadAnimation(mActivity, R.anim.decelerate_alpha); 92 93 assertEquals(DECELERATE_ALPHA_DURATION, anim.getDuration()); 94 assertTrue(anim instanceof AlphaAnimation); 95 96 // factor is 1.0f 97 Interpolator interpolator = new DecelerateInterpolator(1.0f); 98 anim.setInterpolator(interpolator); 99 assertFalse(anim.hasStarted()); 100 101 AnimationTestUtils.assertRunAnimation(mInstrumentation, mActivityRule, animWindow, anim); 102 103 Transformation transformation = new Transformation(); 104 long startTime = anim.getStartTime(); 105 anim.getTransformation(startTime, transformation); 106 float alpha1 = transformation.getAlpha(); 107 assertEquals(0.0f, alpha1, ALPHA_DELTA); 108 109 anim.getTransformation(startTime + 500, transformation); 110 float alpha2 = transformation.getAlpha(); 111 112 anim.getTransformation(startTime + 1000, transformation); 113 float alpha3 = transformation.getAlpha(); 114 115 anim.getTransformation(startTime + 1500, transformation); 116 float alpha4 = transformation.getAlpha(); 117 118 anim.getTransformation(startTime + DECELERATE_ALPHA_DURATION, transformation); 119 float alpha5 = transformation.getAlpha(); 120 assertEquals(1.0f, alpha5, ALPHA_DELTA); 121 122 // check decelerating delta alpha 123 float delta1 = alpha2 - alpha1; 124 float delta2 = alpha3 - alpha2; 125 float delta3 = alpha4 - alpha3; 126 float delta4 = alpha5 - alpha4; 127 assertTrue(delta1 > delta2); 128 assertTrue(delta2 > delta3); 129 assertTrue(delta3 > delta4); 130 131 // factor is 1.5f, it starts even faster and ends evens slower than 1.0f 132 interpolator = new DecelerateInterpolator(1.5f); 133 anim.setInterpolator(interpolator); 134 135 AnimationTestUtils.assertRunAnimation(mInstrumentation, mActivityRule, animWindow, anim); 136 137 transformation = new Transformation(); 138 startTime = anim.getStartTime(); 139 anim.getTransformation(startTime, transformation); 140 float alpha6 = transformation.getAlpha(); 141 assertEquals(0.0f, alpha1, ALPHA_DELTA); 142 143 anim.getTransformation(startTime + 500, transformation); 144 float alpha7 = transformation.getAlpha(); 145 146 anim.getTransformation(startTime + 1000, transformation); 147 float alpha8 = transformation.getAlpha(); 148 149 anim.getTransformation(startTime + 1500, transformation); 150 float alpha9 = transformation.getAlpha(); 151 152 anim.getTransformation(startTime + DECELERATE_ALPHA_DURATION, transformation); 153 float alpha10 = transformation.getAlpha(); 154 assertEquals(1.0f, alpha5, ALPHA_DELTA); 155 156 // check decelerating delta alpha 157 float delta5 = alpha7 - alpha6; 158 float delta6 = alpha8 - alpha7; 159 float delta7 = alpha9 - alpha8; 160 float delta8 = alpha10 - alpha9; 161 assertTrue(delta5 > delta6); 162 assertTrue(delta6 > delta7); 163 assertTrue(delta7 > delta8); 164 165 // check whether it starts even faster 166 assertTrue(delta5 > delta1); 167 } 168 169 @Test 170 public void testGetInterpolation() { 171 final float input = 0.25f; 172 Interpolator interpolator1 = new DecelerateInterpolator(1.0f); 173 // factor is 2.0f, it starts even faster and ends evens slower than 1.0f 174 Interpolator interpolator2 = new DecelerateInterpolator(2.0f); 175 176 float delta1 = interpolator1.getInterpolation(input); 177 float delta2 = interpolator2.getInterpolation(input); 178 179 // check whether it starts even faster 180 assertTrue(delta2 > delta1); 181 } 182 } 183