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