CycleInterpolator.java revision e5e92602a41a4ddc7b42cd1c171a0edfbd09b8da
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view.animation;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
20e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport android.content.res.Resources;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
22e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport android.content.res.Resources.Theme;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport com.android.internal.R;
26c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckimport com.android.internal.view.animation.HasNativeInterpolator;
27c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckimport com.android.internal.view.animation.NativeInterpolatorFactory;
28c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckimport com.android.internal.view.animation.NativeInterpolatorFactoryHelper;
29c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Repeats the animation for a specified number of cycles. The
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rate of change follows a sinusoidal pattern.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
35c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck@HasNativeInterpolator
36c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic class CycleInterpolator implements Interpolator, NativeInterpolatorFactory {
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CycleInterpolator(float cycles) {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCycles = cycles;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public CycleInterpolator(Context context, AttributeSet attrs) {
42e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        this(context.getResources(), context.getTheme(), attrs);
43e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    }
44e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
45e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    /** @hide */
46e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui    public CycleInterpolator(Resources resources, Theme theme, AttributeSet attrs) {
47e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        TypedArray a;
48e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        if (theme != null) {
49e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui            a = theme.obtainStyledAttributes(attrs, R.styleable.CycleInterpolator, 0, 0);
50e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        } else {
51e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui            a = resources.obtainAttributes(attrs, R.styleable.CycleInterpolator);
52e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        }
53e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
54e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui        mCycles = a.getFloat(R.styleable.CycleInterpolator_cycles, 1.0f);
55e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
58e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getInterpolation(float input) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (float)(Math.sin(2 * mCycles * Math.PI * input));
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mCycles;
64c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
65c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    /** @hide */
66c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    @Override
67c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    public long createNativeInterpolator() {
68c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck        return NativeInterpolatorFactoryHelper.createCycleInterpolator(mCycles);
69c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
71