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.graphics.Matrix; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defines the transformation to be applied at 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one point in time of an Animation. 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Transformation { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates a transformation that has no effect (alpha = 1 and identity matrix.) 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32fadd2081443dd2f59f8e8143256a34b7485fe72eRomain Guy public static final int TYPE_IDENTITY = 0x0; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates a transformation that applies an alpha only (uses an identity matrix.) 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36fadd2081443dd2f59f8e8143256a34b7485fe72eRomain Guy public static final int TYPE_ALPHA = 0x1; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates a transformation that applies a matrix only (alpha = 1.) 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 40fadd2081443dd2f59f8e8143256a34b7485fe72eRomain Guy public static final int TYPE_MATRIX = 0x2; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates a transformation that applies an alpha and a matrix. 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 44fadd2081443dd2f59f8e8143256a34b7485fe72eRomain Guy public static final int TYPE_BOTH = TYPE_ALPHA | TYPE_MATRIX; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Matrix mMatrix; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected float mAlpha; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int mTransformationType; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new transformation with alpha = 1 and the identity matrix. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Transformation() { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clear(); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reset the transformation to a state that leaves the object 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * being animated in an unmodified state. The transformation type is 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_BOTH} by default. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clear() { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMatrix == null) { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMatrix = new Matrix(); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMatrix.reset(); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = 1.0f; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformationType = TYPE_BOTH; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates the nature of this transformation. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@link #TYPE_ALPHA}, {@link #TYPE_MATRIX}, 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_BOTH} or {@link #TYPE_IDENTITY}. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getTransformationType() { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTransformationType; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the transformation type. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transformationType One of {@link #TYPE_ALPHA}, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_MATRIX}, {@link #TYPE_BOTH} or 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #TYPE_IDENTITY}. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTransformationType(int transformationType) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformationType = transformationType; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Clones the specified transformation. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param t The transformation to clone. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void set(Transformation t) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = t.getAlpha(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMatrix.set(t.getMatrix()); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTransformationType = t.getTransformationType(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Apply this Transformation to an existing Transformation, e.g. apply 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a scale effect to something that has already been rotated. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param t 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void compose(Transformation t) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha *= t.getAlpha(); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMatrix.preConcat(t.getMatrix()); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1158078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn * Like {@link #compose(Transformation)} but does this.postConcat(t) of 1168078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn * the transformation matrix. 1178078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn * @hide 1188078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn */ 1198078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn public void postCompose(Transformation t) { 1208078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn mAlpha *= t.getAlpha(); 1218078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn mMatrix.postConcat(t.getMatrix()); 1228078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn } 1238078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn 1248078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn /** 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The 3x3 Matrix representing the trnasformation to apply to the 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * coordinates of the object being animated 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Matrix getMatrix() { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMatrix; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the degree of transparency 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alpha 1.0 means fully opaqe and 0.0 means fully transparent 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlpha(float alpha) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = alpha; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The degree of transparency 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float getAlpha() { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAlpha; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn StringBuilder sb = new StringBuilder(64); 1501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("Transformation"); 1511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn toShortString(sb); 1521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return sb.toString(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a string representation of the transformation in a compact form. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toShortString() { 1591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn StringBuilder sb = new StringBuilder(64); 1601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn toShortString(sb); 1611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return sb.toString(); 1621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn /** 1651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn * @hide 1661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn */ 1671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void toShortString(StringBuilder sb) { 1681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append("{alpha="); sb.append(mAlpha); 1691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append(" matrix="); mMatrix.toShortString(sb); 1701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sb.append('}'); 1711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn /** 1741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn * Print short string, to optimize dumping. 1751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn * @hide 1761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn */ 1771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void printShortString(PrintWriter pw) { 1781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print("{alpha="); pw.print(mAlpha); 1791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print(" matrix="); 1801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mMatrix.printShortString(pw); 1811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pw.print('}'); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 184