1bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu/* 2bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * Copyright (C) 2017 The Android Open Source Project 3bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 4bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * Licensed under the Apache License, Version 2.0 (the "License"); 5bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * you may not use this file except in compliance with the License. 6bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * You may obtain a copy of the License at 7bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 8bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * http://www.apache.org/licenses/LICENSE-2.0 9bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 10bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * Unless required by applicable law or agreed to in writing, software 11bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * distributed under the License is distributed on an "AS IS" BASIS, 12bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * See the License for the specific language governing permissions and 14bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * limitations under the License. 15bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu */ 16bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 17bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liupackage android.support.animation; 18bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 19bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liuimport android.annotation.TargetApi; 20bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liuimport android.util.FloatProperty; 21bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 22bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu/** 23bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * <p>FloatPropertyCompat is an abstraction that can be used to represent a mutable float value that 24bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * is held in a host object. To access this float value, {@link #setValue(Object, float)} and getter 25bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * {@link #getValue(Object)} need to be implemented. Both the setter and the getter take the 26bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * primitive <code>float</code> type and avoids autoboxing and other overhead associated with the 27bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * <code>Float</code> class. 28bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 29bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * <p>For API 24 and later, {@link FloatProperty} instances can be converted to 30bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * {@link FloatPropertyCompat} through 31bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * {@link FloatPropertyCompat#createFloatPropertyCompat(FloatProperty)}. 32bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 33bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @param <T> the class on which the Property is declared 34bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu */ 35bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liupublic abstract class FloatPropertyCompat<T> { 36bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu final String mPropertyName; 37bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 38bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu /** 39bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * A constructor that takes an identifying name. 40bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu */ 41bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu public FloatPropertyCompat(String name) { 42bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu mPropertyName = name; 43bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu } 44bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 45bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu /** 46bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * Create a {@link FloatPropertyCompat} wrapper for a {@link FloatProperty} object. The new 47bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * {@link FloatPropertyCompat} instance will access and modify the property value of 48bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * {@link FloatProperty} through the {@link FloatProperty} instance's setter and getter. 49bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 50bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @param property FloatProperty instance to be wrapped 51bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @param <T> the class on which the Property is declared 52bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @return a new {@link FloatPropertyCompat} wrapper for the given {@link FloatProperty} object 53bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu */ 54bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu @TargetApi(24) 55bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu public static <T> FloatPropertyCompat<T> createFloatPropertyCompat( 56bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu final FloatProperty<T> property) { 57bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu return new FloatPropertyCompat<T>(property.getName()) { 58bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu @Override 59bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu public float getValue(T object) { 60bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu return property.get(object); 61bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu } 62bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 63bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu @Override 64bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu public void setValue(T object, float value) { 65bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu property.setValue(object, value); 66bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu } 67bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu }; 68bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu } 69bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 70bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu /** 71bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * Returns the current value that this property represents on the given <code>object</code>. 72bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 73bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @param object object which this property represents 74bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @return the current property value of the given object 75bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu */ 76bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu public abstract float getValue(T object); 77bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu 78bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu /** 79bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * Sets the value on <code>object</code> which this property represents. 80bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * 81bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @param object object which this property represents 82bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu * @param value new value of the property 83bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu */ 84bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu public abstract void setValue(T object, float value); 85bfd3aa4c1b99267c42066918cfe8347b132f4dc1Doris Liu} 86