NativeInterpolatorFactoryHelper_Delegate.java revision d9335203787401aa894544a1dd275fefa37535ec
1ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez/*
2ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Copyright (C) 2016 The Android Open Source Project
3ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *
4ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Licensed under the Apache License, Version 2.0 (the "License");
5ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * you may not use this file except in compliance with the License.
6ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * You may obtain a copy of the License at
7ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *
8ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *      http://www.apache.org/licenses/LICENSE-2.0
9ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez *
10ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Unless required by applicable law or agreed to in writing, software
11ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * distributed under the License is distributed on an "AS IS" BASIS,
12ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * See the License for the specific language governing permissions and
14ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * limitations under the License.
15ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez */
16ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
17ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezpackage com.android.internal.view.animation;
18ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
19ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport com.android.layoutlib.bridge.impl.DelegateManager;
20ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
21ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
22ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.util.MathUtils;
23ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AccelerateDecelerateInterpolator;
24ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AccelerateInterpolator;
25ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AnticipateInterpolator;
26ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AnticipateOvershootInterpolator;
27ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.BaseInterpolator;
28ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.BounceInterpolator;
29ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.CycleInterpolator;
30ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.DecelerateInterpolator;
31ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.Interpolator;
32ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.LinearInterpolator;
33ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.OvershootInterpolator;
34ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
35ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez/**
36ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Delegate used to provide new implementation of a select few methods of {@link
37ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * NativeInterpolatorFactoryHelper}
38ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * <p>
39ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Through the layoutlib_create tool, the original  methods of NativeInterpolatorFactoryHelper have
40ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * been replaced by calls to methods of the same name in this delegate class.
41ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez */
42ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez@SuppressWarnings("unused")
43ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezpublic class NativeInterpolatorFactoryHelper_Delegate {
44ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    private static final DelegateManager<Interpolator> sManager = new DelegateManager<>
45ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            (Interpolator.class);
46ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
47ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    public static Interpolator getDelegate(long nativePtr) {
48ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.getDelegate(nativePtr);
49ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
50ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
51ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
52ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAccelerateDecelerateInterpolator() {
53ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AccelerateDecelerateInterpolator());
54ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
55ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
56ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
57ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAccelerateInterpolator(float factor) {
58ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AccelerateInterpolator(factor));
59ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
60ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
61ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
62ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAnticipateInterpolator(float tension) {
63ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AnticipateInterpolator(tension));
64ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
65ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
66ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
67ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createAnticipateOvershootInterpolator(float tension) {
68ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new AnticipateOvershootInterpolator(tension));
69ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
70ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
71ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
72ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createBounceInterpolator() {
73ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new BounceInterpolator());
74ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
75ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
76ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
77ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createCycleInterpolator(float cycles) {
78ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new CycleInterpolator(cycles));
79ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
80ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
81ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
82ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createDecelerateInterpolator(float factor) {
83ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new DecelerateInterpolator(factor));
84ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
85ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
86ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
87ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createLinearInterpolator() {
88ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new LinearInterpolator());
89ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
90ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
91ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
92ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createOvershootInterpolator(float tension) {
93ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new OvershootInterpolator(tension));
94ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
95ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
96ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    private static class LutInterpolator extends BaseInterpolator {
97ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        private final float[] mValues;
98ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        private final int mSize;
99ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
100ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        private LutInterpolator(float[] values) {
101ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            mValues = values;
102ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            mSize = mValues.length;
103ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        }
104ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
105ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        @Override
106ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        public float getInterpolation(float input) {
107d9335203787401aa894544a1dd275fefa37535ecDoris Liu            float lutpos = input * (mSize - 1);
108ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            if (lutpos >= (mSize - 1)) {
109ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez                return mValues[mSize - 1];
110ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            }
111ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
112ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            int ipart = (int) lutpos;
113ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            float weight = lutpos - ipart;
114ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
115ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            int i1 = ipart;
116ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            int i2 = Math.min(i1 + 1, mSize - 1);
117ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
118ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            assert i1 >= 0 && i2 >= 0 : "Negatives in the interpolation";
119ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
120ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez            return MathUtils.lerp(mValues[i1], mValues[i2], weight);
121ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        }
122ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
123ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez
124ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    @LayoutlibDelegate
125ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    /*package*/ static long createLutInterpolator(float[] values) {
126ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez        return sManager.addNewDelegate(new LutInterpolator(values));
127ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez    }
128ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez}
129