ScaleAnimation.java revision f9d0be917b6f80efad29dce88ad2d2f117986c57
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();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor to use when building a ScaleAnimation from code
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fromX Horizontal scaling factor to apply at the start of the
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        animation
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param toX Horizontal scaling factor to apply at the end of the animation
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fromY Vertical scaling factor to apply at the start of the
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        animation
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param toY Vertical scaling factor to apply at the end of the animation
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ScaleAnimation(float fromX, float toX, float fromY, float toY) {
144f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        mResources = null;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFromX = fromX;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToX = toX;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFromY = fromY;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToY = toY;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotX = 0;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotY = 0;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor to use when building a ScaleAnimation from code
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fromX Horizontal scaling factor to apply at the start of the
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        animation
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param toX Horizontal scaling factor to apply at the end of the animation
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fromY Vertical scaling factor to apply at the start of the
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        animation
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param toY Vertical scaling factor to apply at the end of the animation
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pivotX The X coordinate of the point about which the object is
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        being scaled, specified as an absolute number where 0 is the left
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        edge. (This point remains fixed while the object changes size.)
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pivotY The Y coordinate of the point about which the object is
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        being scaled, specified as an absolute number where 0 is the top
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        edge. (This point remains fixed while the object changes size.)
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ScaleAnimation(float fromX, float toX, float fromY, float toY,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float pivotX, float pivotY) {
171f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        mResources = null;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFromX = fromX;
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToX = toX;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFromY = fromY;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToY = toY;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotXType = ABSOLUTE;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotYType = ABSOLUTE;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotXValue = pivotX;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotYValue = pivotY;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor to use when building a ScaleAnimation from code
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fromX Horizontal scaling factor to apply at the start of the
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        animation
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param toX Horizontal scaling factor to apply at the end of the animation
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fromY Vertical scaling factor to apply at the start of the
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        animation
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param toY Vertical scaling factor to apply at the end of the animation
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pivotXType Specifies how pivotXValue should be interpreted. One of
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        Animation.RELATIVE_TO_PARENT.
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pivotXValue The X coordinate of the point about which the object
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        is being scaled, specified as an absolute number where 0 is the
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        left edge. (This point remains fixed while the object changes
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        size.) This value can either be an absolute number if pivotXType
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pivotYType Specifies how pivotYValue should be interpreted. One of
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        Animation.RELATIVE_TO_PARENT.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pivotYValue The Y coordinate of the point about which the object
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        is being scaled, specified as an absolute number where 0 is the
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        top edge. (This point remains fixed while the object changes
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        size.) This value can either be an absolute number if pivotYType
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ScaleAnimation(float fromX, float toX, float fromY, float toY,
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
211f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        mResources = null;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFromX = fromX;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToX = toX;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFromY = fromY;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mToY = toY;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotXValue = pivotXValue;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotXType = pivotXType;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotYValue = pivotYValue;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotYType = pivotYType;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void applyTransformation(float interpolatedTime, Transformation t) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float sx = 1.0f;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float sy = 1.0f;
2274846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase        float scale = getScaleFactor();
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFromX != 1.0f || mToX != 1.0f) {
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sx = mFromX + ((mToX - mFromX) * interpolatedTime);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFromY != 1.0f || mToY != 1.0f) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sy = mFromY + ((mToY - mFromY) * interpolatedTime);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPivotX == 0 && mPivotY == 0) {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            t.getMatrix().setScale(sx, sy);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
2394846032ac7be7c28c7cfeb3096b8cb656312a382Chet Haase            t.getMatrix().setScale(sx, sy, scale * mPivotX, scale * mPivotY);
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
243f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn    float resolveScale(float scale, int type, int data, int size, int psize) {
244f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        float targetSize;
245f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        if (type == TypedValue.TYPE_FRACTION) {
246f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            targetSize = TypedValue.complexToFraction(data, size, psize);
247f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        } else if (type == TypedValue.TYPE_DIMENSION) {
248f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            targetSize = TypedValue.complexToDimension(data, mResources.getDisplayMetrics());
249f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        } else {
250f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            return scale;
251f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        }
252f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
253f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        if (size == 0) {
254f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn            return 1;
255f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        }
256f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
257f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        return targetSize/(float)size;
258f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn    }
259f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void initialize(int width, int height, int parentWidth, int parentHeight) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.initialize(width, height, parentWidth, parentHeight);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
264f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        mFromX = resolveScale(mFromX, mFromXType, mFromXData, width, parentWidth);
265f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        mToX = resolveScale(mToX, mToXType, mToXData, width, parentWidth);
266f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        mFromY = resolveScale(mFromY, mFromYType, mFromYData, height, parentHeight);
267f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn        mToY = resolveScale(mToY, mToYType, mToYData, height, parentHeight);
268f9d0be917b6f80efad29dce88ad2d2f117986c57Dianne Hackborn
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
273