blob: 8537d4213d7c066deac65e8e88c0097439aac543 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.view.animation;
18
19import android.content.Context;
20import android.content.res.TypedArray;
21import android.util.AttributeSet;
22
23/**
24 * An animation that controls the scale of an object. You can specify the point
25 * to use for the center of scaling.
26 *
27 */
28public class ScaleAnimation extends Animation {
29 private float mFromX;
30 private float mToX;
31 private float mFromY;
32 private float mToY;
33
34 private int mPivotXType = ABSOLUTE;
35 private int mPivotYType = ABSOLUTE;
36 private float mPivotXValue = 0.0f;
37 private float mPivotYValue = 0.0f;
38
39 private float mPivotX;
40 private float mPivotY;
41
42 /**
The Android Open Source Projectbdbdc4f2009-03-03 21:00:54 -080043 * Constructor used when a ScaleAnimation is loaded from a resource.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080044 *
45 * @param context Application context to use
46 * @param attrs Attribute set from which to read values
47 */
48 public ScaleAnimation(Context context, AttributeSet attrs) {
49 super(context, attrs);
50
51 TypedArray a = context.obtainStyledAttributes(attrs,
52 com.android.internal.R.styleable.ScaleAnimation);
53
54 mFromX = a.getFloat(com.android.internal.R.styleable.ScaleAnimation_fromXScale, 0.0f);
55 mToX = a.getFloat(com.android.internal.R.styleable.ScaleAnimation_toXScale, 0.0f);
56
57 mFromY = a.getFloat(com.android.internal.R.styleable.ScaleAnimation_fromYScale, 0.0f);
58 mToY = a.getFloat(com.android.internal.R.styleable.ScaleAnimation_toYScale, 0.0f);
59
60 Description d = Description.parseValue(a.peekValue(
61 com.android.internal.R.styleable.ScaleAnimation_pivotX));
62 mPivotXType = d.type;
63 mPivotXValue = d.value;
64
65 d = Description.parseValue(a.peekValue(
66 com.android.internal.R.styleable.ScaleAnimation_pivotY));
67 mPivotYType = d.type;
68 mPivotYValue = d.value;
69
70 a.recycle();
71 }
72
73 /**
74 * Constructor to use when building a ScaleAnimation from code
75 *
76 * @param fromX Horizontal scaling factor to apply at the start of the
77 * animation
78 * @param toX Horizontal scaling factor to apply at the end of the animation
79 * @param fromY Vertical scaling factor to apply at the start of the
80 * animation
81 * @param toY Vertical scaling factor to apply at the end of the animation
82 */
83 public ScaleAnimation(float fromX, float toX, float fromY, float toY) {
84 mFromX = fromX;
85 mToX = toX;
86 mFromY = fromY;
87 mToY = toY;
88 mPivotX = 0;
89 mPivotY = 0;
90 }
91
92 /**
93 * Constructor to use when building a ScaleAnimation from code
94 *
95 * @param fromX Horizontal scaling factor to apply at the start of the
96 * animation
97 * @param toX Horizontal scaling factor to apply at the end of the animation
98 * @param fromY Vertical scaling factor to apply at the start of the
99 * animation
100 * @param toY Vertical scaling factor to apply at the end of the animation
101 * @param pivotX The X coordinate of the point about which the object is
102 * being scaled, specified as an absolute number where 0 is the left
103 * edge. (This point remains fixed while the object changes size.)
104 * @param pivotY The Y coordinate of the point about which the object is
105 * being scaled, specified as an absolute number where 0 is the top
106 * edge. (This point remains fixed while the object changes size.)
107 */
108 public ScaleAnimation(float fromX, float toX, float fromY, float toY,
109 float pivotX, float pivotY) {
110 mFromX = fromX;
111 mToX = toX;
112 mFromY = fromY;
113 mToY = toY;
114
115 mPivotXType = ABSOLUTE;
116 mPivotYType = ABSOLUTE;
117 mPivotXValue = pivotX;
118 mPivotYValue = pivotY;
119 }
120
121 /**
122 * Constructor to use when building a ScaleAnimation from code
123 *
124 * @param fromX Horizontal scaling factor to apply at the start of the
125 * animation
126 * @param toX Horizontal scaling factor to apply at the end of the animation
127 * @param fromY Vertical scaling factor to apply at the start of the
128 * animation
129 * @param toY Vertical scaling factor to apply at the end of the animation
130 * @param pivotXType Specifies how pivotXValue should be interpreted. One of
131 * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
132 * Animation.RELATIVE_TO_PARENT.
133 * @param pivotXValue The X coordinate of the point about which the object
134 * is being scaled, specified as an absolute number where 0 is the
135 * left edge. (This point remains fixed while the object changes
136 * size.) This value can either be an absolute number if pivotXType
137 * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
138 * @param pivotYType Specifies how pivotYValue should be interpreted. One of
139 * Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
140 * Animation.RELATIVE_TO_PARENT.
141 * @param pivotYValue The Y coordinate of the point about which the object
142 * is being scaled, specified as an absolute number where 0 is the
143 * top edge. (This point remains fixed while the object changes
144 * size.) This value can either be an absolute number if pivotYType
145 * is ABSOLUTE, or a percentage (where 1.0 is 100%) otherwise.
146 */
147 public ScaleAnimation(float fromX, float toX, float fromY, float toY,
148 int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
149 mFromX = fromX;
150 mToX = toX;
151 mFromY = fromY;
152 mToY = toY;
153
154 mPivotXValue = pivotXValue;
155 mPivotXType = pivotXType;
156 mPivotYValue = pivotYValue;
157 mPivotYType = pivotYType;
158 }
159
160 @Override
161 protected void applyTransformation(float interpolatedTime, Transformation t) {
162 float sx = 1.0f;
163 float sy = 1.0f;
Chet Haase48460322010-06-11 14:22:25 -0700164 float scale = getScaleFactor();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800165
166 if (mFromX != 1.0f || mToX != 1.0f) {
167 sx = mFromX + ((mToX - mFromX) * interpolatedTime);
168 }
169 if (mFromY != 1.0f || mToY != 1.0f) {
170 sy = mFromY + ((mToY - mFromY) * interpolatedTime);
171 }
172
173 if (mPivotX == 0 && mPivotY == 0) {
174 t.getMatrix().setScale(sx, sy);
175 } else {
Chet Haase48460322010-06-11 14:22:25 -0700176 t.getMatrix().setScale(sx, sy, scale * mPivotX, scale * mPivotY);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800177 }
178 }
179
180 @Override
181 public void initialize(int width, int height, int parentWidth, int parentHeight) {
182 super.initialize(width, height, parentWidth, parentHeight);
183
184 mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth);
185 mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight);
186 }
187}