18a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez/* 28a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Copyright (C) 2016 The Android Open Source Project 38a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * 48a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Licensed under the Apache License, Version 2.0 (the "License"); 58a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * you may not use this file except in compliance with the License. 68a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * You may obtain a copy of the License at 78a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * 88a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * http://www.apache.org/licenses/LICENSE-2.0 98a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * 108a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Unless required by applicable law or agreed to in writing, software 118a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * distributed under the License is distributed on an "AS IS" BASIS, 128a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * See the License for the specific language governing permissions and 148a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * limitations under the License. 158a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez */ 168a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 178a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezpackage com.android.internal.view.animation; 188a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 198a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport com.android.layoutlib.bridge.impl.DelegateManager; 208a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport com.android.tools.layoutlib.annotations.LayoutlibDelegate; 218a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 228a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.util.MathUtils; 238a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AccelerateDecelerateInterpolator; 248a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AccelerateInterpolator; 258a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AnticipateInterpolator; 268a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.AnticipateOvershootInterpolator; 278a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.BaseInterpolator; 288a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.BounceInterpolator; 298a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.CycleInterpolator; 308a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.DecelerateInterpolator; 318a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.Interpolator; 328a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.LinearInterpolator; 338a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezimport android.view.animation.OvershootInterpolator; 348a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 358a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez/** 368a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Delegate used to provide new implementation of a select few methods of {@link 378a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * NativeInterpolatorFactoryHelper} 388a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * <p> 398a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * Through the layoutlib_create tool, the original methods of NativeInterpolatorFactoryHelper have 408a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez * been replaced by calls to methods of the same name in this delegate class. 418a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez */ 428a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez@SuppressWarnings("unused") 438a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perezpublic class NativeInterpolatorFactoryHelper_Delegate { 448a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez private static final DelegateManager<Interpolator> sManager = new DelegateManager<> 458a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez (Interpolator.class); 468a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 478a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez public static Interpolator getDelegate(long nativePtr) { 488a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.getDelegate(nativePtr); 498a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 508a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 518a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 528a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createAccelerateDecelerateInterpolator() { 538a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new AccelerateDecelerateInterpolator()); 548a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 558a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 568a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 578a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createAccelerateInterpolator(float factor) { 588a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new AccelerateInterpolator(factor)); 598a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 608a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 618a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 628a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createAnticipateInterpolator(float tension) { 638a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new AnticipateInterpolator(tension)); 648a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 658a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 668a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 678a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createAnticipateOvershootInterpolator(float tension) { 688a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new AnticipateOvershootInterpolator(tension)); 698a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 708a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 718a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 728a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createBounceInterpolator() { 738a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new BounceInterpolator()); 748a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 758a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 768a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 778a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createCycleInterpolator(float cycles) { 788a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new CycleInterpolator(cycles)); 798a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 808a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 818a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 828a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createDecelerateInterpolator(float factor) { 838a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new DecelerateInterpolator(factor)); 848a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 858a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 868a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 878a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createLinearInterpolator() { 888a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new LinearInterpolator()); 898a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 908a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 918a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 928a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createOvershootInterpolator(float tension) { 938a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new OvershootInterpolator(tension)); 948a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 958a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 968a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez private static class LutInterpolator extends BaseInterpolator { 978a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez private final float[] mValues; 988a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez private final int mSize; 998a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 1008a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez private LutInterpolator(float[] values) { 1018a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez mValues = values; 1028a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez mSize = mValues.length; 1038a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 1048a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 1058a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @Override 1068a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez public float getInterpolation(float input) { 1070940834c8cc024985f20bbdd19fb32c73ccb25f2Doris Liu float lutpos = input * (mSize - 1); 1088a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez if (lutpos >= (mSize - 1)) { 1098a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return mValues[mSize - 1]; 1108a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 1118a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 1128a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez int ipart = (int) lutpos; 1138a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez float weight = lutpos - ipart; 1148a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 1158a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez int i1 = ipart; 1168a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez int i2 = Math.min(i1 + 1, mSize - 1); 1178a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 1188a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez assert i1 >= 0 && i2 >= 0 : "Negatives in the interpolation"; 1198a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 1208a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return MathUtils.lerp(mValues[i1], mValues[i2], weight); 1218a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 1228a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 1238a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez 1248a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez @LayoutlibDelegate 1258a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez /*package*/ static long createLutInterpolator(float[] values) { 1268a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez return sManager.addNewDelegate(new LutInterpolator(values)); 1278a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez } 1288a9a824cd5641d214906a20a2a9372e62e9f3fb8Diego Perez} 129