105de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu/* 205de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * Copyright (C) 2016 The Android Open Source Project 305de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * 4e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * Licensed under the Apache License, Version 2.0 (the "License"); 5e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * you may not use this file except in compliance with the License. 6e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * You may obtain a copy of the License at 705de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * 8e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * http://www.apache.org/licenses/LICENSE-2.0 905de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * 10e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * Unless required by applicable law or agreed to in writing, software 11e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * distributed under the License is distributed on an "AS IS" BASIS, 12e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * See the License for the specific language governing permissions and 14e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu * limitations under the License. 1505de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu */ 16e1cde4d4ac42a6e9e16aad2b4df970c7c7d0771cDake Gu 1705de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gupackage android.support.v17.leanback.widget; 1805de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 1905de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Guimport android.animation.ObjectAnimator; 2005de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Guimport android.animation.PropertyValuesHolder; 21bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Guimport android.util.Property; 2246ae6eb27de10f019258fe197c794cf2234abe5dsusnataimport android.view.animation.LinearInterpolator; 2305de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 2405de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu/** 25bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * ParallaxTarget is responsible for updating the target through the {@link #update(float)} method 26bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * or the {@link #directUpdate(Number)} method when {@link #isDirectMapping()} is true. 27bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * When {@link #isDirectMapping()} is false, {@link ParallaxEffect} transforms the values of 28bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * {@link Parallax}, which represents the current state of UI, into a float value between 0 and 1. 29bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * That float value is passed into {@link #update(float)} method. 3005de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu */ 3105de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gupublic abstract class ParallaxTarget { 3205de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 3305de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu /** 3405de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * Implementation class is supposed to update target with the provided fraction 3505de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * (between 0 and 1). The fraction represents percentage of completed change (e.g. scroll) on 36bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * target. Called only when {@link #isDirectMapping()} is false. 3705de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * 3805de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * @param fraction Fraction between 0 to 1. 39bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @see #isDirectMapping() 4005de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu */ 41bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu public void update(float fraction) { 42bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu } 4305de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 4405de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu /** 45bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * Returns true if the ParallaxTarget is directly mapping from source value, 46bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * {@link #directUpdate(Number)} will be used to update value, otherwise update(fraction) will 47bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * be called to update value. Default implementation returns false. 4805de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * 49bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @return True if direct mapping, false otherwise. 50bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @see #directUpdate(Number) 51bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @see #update(float) 5205de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu */ 53bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu public boolean isDirectMapping() { 54bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu return false; 55bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu } 56bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu 57bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu /** 58bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * Directly update the target using a float or int value. Called when {@link #isDirectMapping()} 59bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * is true. 60bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * 61bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @param value Either int or float value. 62bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @see #isDirectMapping() 63bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu */ 64bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu public void directUpdate(Number value) { 65bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu } 6605de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 6705de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu /** 6805de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * PropertyValuesHolderTarget is an implementation of {@link ParallaxTarget} that uses 6905de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * {@link PropertyValuesHolder} to update the target object. 7005de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu */ 7105de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu public static final class PropertyValuesHolderTarget extends ParallaxTarget { 7205de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 7305de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu /** 7405de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * We simulate a parallax effect on target object using an ObjectAnimator. PSEUDO_DURATION 7505de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu * is used on the ObjectAnimator. 7605de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu */ 7705de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu private static final long PSEUDO_DURATION = 1000000; 7805de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 7905de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu private final ObjectAnimator mAnimator; 8005de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu private float mFraction; 8105de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 8205de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu public PropertyValuesHolderTarget(Object targetObject, PropertyValuesHolder values) { 8305de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu mAnimator = ObjectAnimator.ofPropertyValuesHolder(targetObject, values); 8446ae6eb27de10f019258fe197c794cf2234abe5dsusnata mAnimator.setInterpolator(new LinearInterpolator()); 8505de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu mAnimator.setDuration(PSEUDO_DURATION); 8605de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu } 8705de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 8805de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu @Override 8905de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu public void update(float fraction) { 9005de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu mFraction = fraction; 9105de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu mAnimator.setCurrentPlayTime((long) (PSEUDO_DURATION * fraction)); 9205de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu } 9305de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu 94bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu } 95bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu 96bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu /** 97bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * DirectPropertyTarget is to support direct mapping into either Integer Property or Float 98bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * Property. App uses convenient method {@link ParallaxEffect#target(Object, Property)} to 99bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * add a direct mapping. 100bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @param <T> Type of target object. 101bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @param <V> Type of value, either Integer or Float. 102bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu */ 103bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu public static final class DirectPropertyTarget<T extends Object, V extends Number> 104bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu extends ParallaxTarget { 105bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu 106bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu Object mObject; 107bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu Property<T, V> mProperty; 108bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu 109bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu /** 110bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @param targetObject Target object for perform Parallax 111bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * @param property Target property, either an Integer Property or a Float Property. 112bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu */ 113bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu public DirectPropertyTarget(Object targetObject, Property<T, V> property) { 114bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu mObject = targetObject; 115bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu mProperty = property; 116bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu } 117bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu 118bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu /** 119bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * Returns true as DirectPropertyTarget receives a number to update Property in 120bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu * {@link #directUpdate(Number)}. 121bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu */ 122bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu @Override 123bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu public boolean isDirectMapping() { 124bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu return true; 125bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu } 126bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu 12705de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu @Override 128bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu public void directUpdate(Number value) { 129bf4318c67254bc11307796601b9fb4a8bbfe67b2Dake Gu mProperty.set((T) mObject, (V) value); 13005de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu } 13105de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu } 13205de4b68e45fc22c867d49ab88e2bdfd599bf7ccDake Gu} 133