19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view.animation; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 20f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackbornimport android.content.res.Resources; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 23f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackbornimport android.util.TypedValue; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An animation that controls the scale of an object. You can specify the point 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to use for the center of scaling. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ScaleAnimation extends Animation { 31f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private final Resources mResources; 32f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mFromX; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mToX; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mFromY; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mToY; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mFromXType = TypedValue.TYPE_NULL; 39f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mToXType = TypedValue.TYPE_NULL; 40f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mFromYType = TypedValue.TYPE_NULL; 41f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mToYType = TypedValue.TYPE_NULL; 42f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 43f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mFromXData = 0; 44f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mToXData = 0; 45f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mFromYData = 0; 46f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn private int mToYData = 0; 47f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPivotXType = ABSOLUTE; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPivotYType = ABSOLUTE; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mPivotXValue = 0.0f; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mPivotYValue = 0.0f; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mPivotX; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float mPivotY; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 57bdbdc4f92951200a88d4c754448b9f91626ffc04The Android Open Source Project * Constructor used when a ScaleAnimation is loaded from a resource. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Application context to use 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs Attribute set from which to read values 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ScaleAnimation(Context context, AttributeSet attrs) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 65f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mResources = context.getResources(); 66f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.ScaleAnimation); 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn TypedValue tv = a.peekValue( 71f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn com.android.internal.R.styleable.ScaleAnimation_fromXScale); 72f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromX = 0.0f; 73f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv != null) { 74f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv.type == TypedValue.TYPE_FLOAT) { 75f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn // This is a scaling factor. 76f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromX = tv.getFloat(); 77f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 78f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromXType = tv.type; 79f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromXData = tv.data; 80f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 81f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 82f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn tv = a.peekValue( 83f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn com.android.internal.R.styleable.ScaleAnimation_toXScale); 84f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToX = 0.0f; 85f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv != null) { 86f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv.type == TypedValue.TYPE_FLOAT) { 87f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn // This is a scaling factor. 88f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToX = tv.getFloat(); 89f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 90f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToXType = tv.type; 91f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToXData = tv.data; 92f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 93f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 95f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn tv = a.peekValue( 96f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn com.android.internal.R.styleable.ScaleAnimation_fromYScale); 97f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromY = 0.0f; 98f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv != null) { 99f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv.type == TypedValue.TYPE_FLOAT) { 100f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn // This is a scaling factor. 101f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromY = tv.getFloat(); 102f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 103f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromYType = tv.type; 104f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromYData = tv.data; 105f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 106f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 107f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn tv = a.peekValue( 108f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn com.android.internal.R.styleable.ScaleAnimation_toYScale); 109f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToY = 0.0f; 110f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv != null) { 111f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (tv.type == TypedValue.TYPE_FLOAT) { 112f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn // This is a scaling factor. 113f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToY = tv.getFloat(); 114f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 115f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToYType = tv.type; 116f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToYData = tv.data; 117f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 118f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Description d = Description.parseValue(a.peekValue( 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.ScaleAnimation_pivotX)); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotXType = d.type; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotXValue = d.value; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project d = Description.parseValue(a.peekValue( 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.ScaleAnimation_pivotY)); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotYType = d.type; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotYValue = d.value; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 13184c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase 13284c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase initializePivotPoint(); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor to use when building a ScaleAnimation from code 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fromX Horizontal scaling factor to apply at the start of the 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param toX Horizontal scaling factor to apply at the end of the animation 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fromY Vertical scaling factor to apply at the start of the 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param toY Vertical scaling factor to apply at the end of the animation 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ScaleAnimation(float fromX, float toX, float fromY, float toY) { 146f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mResources = null; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromX = fromX; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToX = toX; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromY = fromY; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToY = toY; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotX = 0; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotY = 0; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor to use when building a ScaleAnimation from code 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fromX Horizontal scaling factor to apply at the start of the 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param toX Horizontal scaling factor to apply at the end of the animation 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fromY Vertical scaling factor to apply at the start of the 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param toY Vertical scaling factor to apply at the end of the animation 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pivotX The X coordinate of the point about which the object is 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being scaled, specified as an absolute number where 0 is the left 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * edge. (This point remains fixed while the object changes size.) 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pivotY The Y coordinate of the point about which the object is 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being scaled, specified as an absolute number where 0 is the top 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * edge. (This point remains fixed while the object changes size.) 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ScaleAnimation(float fromX, float toX, float fromY, float toY, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float pivotX, float pivotY) { 173f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mResources = null; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromX = fromX; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToX = toX; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromY = fromY; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToY = toY; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotXType = ABSOLUTE; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotYType = ABSOLUTE; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotXValue = pivotX; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotYValue = pivotY; 18384c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase initializePivotPoint(); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructor to use when building a ScaleAnimation from code 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fromX Horizontal scaling factor to apply at the start of the 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param toX Horizontal scaling factor to apply at the end of the animation 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fromY Vertical scaling factor to apply at the start of the 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param toY Vertical scaling factor to apply at the end of the animation 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pivotXType Specifies how pivotXValue should be interpreted. One of 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Animation.RELATIVE_TO_PARENT. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pivotXValue The X coordinate of the point about which the object 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being scaled, specified as an absolute number where 0 is the 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * left edge. (This point remains fixed while the object changes 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size.) This value can either be an absolute number if pivotXType 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pivotYType Specifies how pivotYValue should be interpreted. One of 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Animation.RELATIVE_TO_PARENT. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pivotYValue The Y coordinate of the point about which the object 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being scaled, specified as an absolute number where 0 is the 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * top edge. (This point remains fixed while the object changes 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * size.) This value can either be an absolute number if pivotYType 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise. 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ScaleAnimation(float fromX, float toX, float fromY, float toY, 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) { 214f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mResources = null; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromX = fromX; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToX = toX; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFromY = fromY; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mToY = toY; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotXValue = pivotXValue; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotXType = pivotXType; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotYValue = pivotYValue; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotYType = pivotYType; 22484c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase initializePivotPoint(); 22584c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase } 22684c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase 22784c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase /** 22884c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase * Called at the end of constructor methods to initialize, if possible, values for 22984c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase * the pivot point. This is only possible for ABSOLUTE pivot values. 23084c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase */ 23184c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase private void initializePivotPoint() { 23284c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase if (mPivotXType == ABSOLUTE) { 23384c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase mPivotX = mPivotXValue; 23484c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase } 23584c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase if (mPivotYType == ABSOLUTE) { 23684c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase mPivotY = mPivotYValue; 23784c949f3b130c9f375203cdb4a3cc4af6b38a4f3Chet Haase } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void applyTransformation(float interpolatedTime, Transformation t) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float sx = 1.0f; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float sy = 1.0f; 2444846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase float scale = getScaleFactor(); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFromX != 1.0f || mToX != 1.0f) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sx = mFromX + ((mToX - mFromX) * interpolatedTime); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFromY != 1.0f || mToY != 1.0f) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sy = mFromY + ((mToY - mFromY) * interpolatedTime); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPivotX == 0 && mPivotY == 0) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.getMatrix().setScale(sx, sy); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2564846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase t.getMatrix().setScale(sx, sy, scale * mPivotX, scale * mPivotY); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 260f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn float resolveScale(float scale, int type, int data, int size, int psize) { 261f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn float targetSize; 262f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (type == TypedValue.TYPE_FRACTION) { 263f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn targetSize = TypedValue.complexToFraction(data, size, psize); 264f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else if (type == TypedValue.TYPE_DIMENSION) { 265f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn targetSize = TypedValue.complexToDimension(data, mResources.getDisplayMetrics()); 266f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } else { 267f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn return scale; 268f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 269f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 270f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn if (size == 0) { 271f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn return 1; 272f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 273f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 274f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn return targetSize/(float)size; 275f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn } 276f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void initialize(int width, int height, int parentWidth, int parentHeight) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.initialize(width, height, parentWidth, parentHeight); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 281f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromX = resolveScale(mFromX, mFromXType, mFromXData, width, parentWidth); 282f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToX = resolveScale(mToX, mToXType, mToXData, width, parentWidth); 283f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mFromY = resolveScale(mFromY, mFromYType, mFromYData, height, parentHeight); 284f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn mToY = resolveScale(mToY, mToYType, mToYData, height, parentHeight); 285f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 290