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 22d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillardimport android.graphics.Path; 23ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.util.MathUtils; 24ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AccelerateDecelerateInterpolator; 25ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AccelerateInterpolator; 26ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AnticipateInterpolator; 27ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.AnticipateOvershootInterpolator; 28ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.BaseInterpolator; 29ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.BounceInterpolator; 30ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.CycleInterpolator; 31ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.DecelerateInterpolator; 32ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.Interpolator; 33ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.LinearInterpolator; 34ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezimport android.view.animation.OvershootInterpolator; 35d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillardimport android.view.animation.PathInterpolator; 36ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 37ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez/** 38ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Delegate used to provide new implementation of a select few methods of {@link 39ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * NativeInterpolatorFactoryHelper} 40ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * <p> 41ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * Through the layoutlib_create tool, the original methods of NativeInterpolatorFactoryHelper have 42ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez * been replaced by calls to methods of the same name in this delegate class. 43ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez */ 44ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez@SuppressWarnings("unused") 45ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perezpublic class NativeInterpolatorFactoryHelper_Delegate { 46ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez private static final DelegateManager<Interpolator> sManager = new DelegateManager<> 47ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez (Interpolator.class); 48ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 49ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez public static Interpolator getDelegate(long nativePtr) { 50ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.getDelegate(nativePtr); 51ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 52ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 53ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 54ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createAccelerateDecelerateInterpolator() { 55ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new AccelerateDecelerateInterpolator()); 56ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 57ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 58ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 59ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createAccelerateInterpolator(float factor) { 60ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new AccelerateInterpolator(factor)); 61ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 62ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 63ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 64ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createAnticipateInterpolator(float tension) { 65ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new AnticipateInterpolator(tension)); 66ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 67ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 68ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 69ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createAnticipateOvershootInterpolator(float tension) { 70ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new AnticipateOvershootInterpolator(tension)); 71ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 72ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 73ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 74ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createBounceInterpolator() { 75ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new BounceInterpolator()); 76ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 77ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 78ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 79ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createCycleInterpolator(float cycles) { 80ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new CycleInterpolator(cycles)); 81ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 82ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 83ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 84ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createDecelerateInterpolator(float factor) { 85ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new DecelerateInterpolator(factor)); 86ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 87ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 88ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 89ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createLinearInterpolator() { 90ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new LinearInterpolator()); 91ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 92ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 93ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 94ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createOvershootInterpolator(float tension) { 95ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new OvershootInterpolator(tension)); 96ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 97ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 98d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard @LayoutlibDelegate 99d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard /*package*/ static long createPathInterpolator(float[] x, float[] y) { 100d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard Path path = new Path(); 101d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard path.moveTo(x[0], y[0]); 102d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard for (int i = 1; i < x.length; i++) { 103d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard path.lineTo(x[i], y[i]); 104d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard } 105d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard return sManager.addNewDelegate(new PathInterpolator(path)); 106d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard } 107d4a724a24f1aef905b6938c50ff14553c13083c0Jerome Gaillard 108ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez private static class LutInterpolator extends BaseInterpolator { 109ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez private final float[] mValues; 110ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez private final int mSize; 111ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 112ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez private LutInterpolator(float[] values) { 113ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez mValues = values; 114ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez mSize = mValues.length; 115ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 116ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 117ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @Override 118ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez public float getInterpolation(float input) { 119d9335203787401aa894544a1dd275fefa37535ecDoris Liu float lutpos = input * (mSize - 1); 120ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez if (lutpos >= (mSize - 1)) { 121ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return mValues[mSize - 1]; 122ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 123ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 124ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez int ipart = (int) lutpos; 125ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez float weight = lutpos - ipart; 126ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 127ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez int i1 = ipart; 128ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez int i2 = Math.min(i1 + 1, mSize - 1); 129ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 130ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez assert i1 >= 0 && i2 >= 0 : "Negatives in the interpolation"; 131ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 132ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return MathUtils.lerp(mValues[i1], mValues[i2], weight); 133ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 134ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 135ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez 136ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez @LayoutlibDelegate 137ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez /*package*/ static long createLutInterpolator(float[] values) { 138ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez return sManager.addNewDelegate(new LutInterpolator(values)); 139ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez } 140ee552063dd04ab2ccc536e3431ca986d277a85f9Diego Perez} 141