16412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh/* 26412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Copyright (C) 2015 The Android Open Source Project 36412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * 46412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Licensed under the Apache License, Version 2.0 (the "License"); 56412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * you may not use this file except in compliance with the License. 66412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * You may obtain a copy of the License at 76412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * 86412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * http://www.apache.org/licenses/LICENSE-2.0 96412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * 106412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Unless required by applicable law or agreed to in writing, software 116412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * distributed under the License is distributed on an "AS IS" BASIS, 126412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * See the License for the specific language governing permissions and 146412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * limitations under the License 156412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh */ 166412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 176412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughpackage android.support.wearable.view; 186412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 196412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughimport android.animation.TimeInterpolator; 206412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughimport android.annotation.TargetApi; 216412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughimport android.os.Build; 226412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 236412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh/** 246412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Interpolator that uses a Bezier derived S shaped curve. 256412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * @hide 266412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh */ 276412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh@TargetApi(Build.VERSION_CODES.KITKAT_WATCH) 286412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughclass Gusterpolator implements TimeInterpolator { 296412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 306412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh /** An instance of {@link android.support.wearable.view.Gusterpolator}. */ 316412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh public static final Gusterpolator INSTANCE = new Gusterpolator(); 326412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 336412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh /** 346412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * To avoid users of this class creating multiple copies needlessly, the constructor is 356412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * private. 366412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh */ 376412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh private Gusterpolator() {} 386412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 396412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh /** 406412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Lookup table values. 416412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Generated using a Bezier curve from (0,0) to (1,1) with control points: 426412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * P0 (0,0) 436412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * P1 (0.4, 0) 446412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * P2 (0.2, 1.0) 456412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * P3 (1.0, 1.0) 466412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * 476412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Values sampled with x at regular intervals between 0 and 1. 486412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh */ 496412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh private static final float[] VALUES = new float[] { 506412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.0f, 0.0002f, 0.0009f, 0.0019f, 0.0036f, 0.0059f, 0.0086f, 0.0119f, 0.0157f, 0.0209f, 516412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.0257f, 0.0321f, 0.0392f, 0.0469f, 0.0566f, 0.0656f, 0.0768f, 0.0887f, 0.1033f, 0.1186f, 526412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.1349f, 0.1519f, 0.1696f, 0.1928f, 0.2121f, 0.237f, 0.2627f, 0.2892f, 0.3109f, 0.3386f, 536412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.3667f, 0.3952f, 0.4241f, 0.4474f, 0.4766f, 0.5f, 0.5234f, 0.5468f, 0.5701f, 0.5933f, 546412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.6134f, 0.6333f, 0.6531f, 0.6698f, 0.6891f, 0.7054f, 0.7214f, 0.7346f, 0.7502f, 0.763f, 556412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.7756f, 0.7879f, 0.8f, 0.8107f, 0.8212f, 0.8326f, 0.8415f, 0.8503f, 0.8588f, 0.8672f, 566412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.8754f, 0.8833f, 0.8911f, 0.8977f, 0.9041f, 0.9113f, 0.9165f, 0.9232f, 0.9281f, 0.9328f, 576412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.9382f, 0.9434f, 0.9476f, 0.9518f, 0.9557f, 0.9596f, 0.9632f, 0.9662f, 0.9695f, 0.9722f, 586412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.9753f, 0.9777f, 0.9805f, 0.9826f, 0.9847f, 0.9866f, 0.9884f, 0.9901f, 0.9917f, 0.9931f, 596412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 0.9944f, 0.9955f, 0.9964f, 0.9973f, 0.9981f, 0.9986f, 0.9992f, 0.9995f, 0.9998f, 1.0f, 1.0f 606412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh }; 616412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 626412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh private static final float STEP_SIZE = 1.0f / (VALUES.length - 1); 636412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 646412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh @Override 656412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh public float getInterpolation(float input) { 666412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh if (input >= 1.0f) { 676412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh return 1.0f; 686412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh } 696412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 706412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh if (input <= 0f) { 716412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh return 0f; 726412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh } 736412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 746412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh int position = Math.min( 756412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh (int)(input * (VALUES.length - 1)), 766412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh VALUES.length - 2); 776412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 786412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh float quantized = position * STEP_SIZE; 796412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh float difference = input - quantized; 806412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh float weight = difference / STEP_SIZE; 816412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh 826412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh return VALUES[position] + weight * (VALUES[position + 1] - VALUES[position]); 836412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh } 846412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh} 85