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