19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 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 org.xmlpull.v1.XmlPullParser; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 227b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.AnimRes; 237b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbyeimport android.annotation.InterpolatorRes; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 25e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport android.content.res.Resources; 26e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghuiimport android.content.res.Resources.Theme; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources.NotFoundException; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Xml; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defines common utilities for working with animations. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class AnimationUtils { 40f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 41f54a8d7c479485174941c38f151ea7083c658da3Chet Haase /** 42a18a86b43e40e3c15dcca0ae0148d641be9b25feChet Haase * These flags are used when parsing AnimatorSet objects 43f54a8d7c479485174941c38f151ea7083c658da3Chet Haase */ 44f54a8d7c479485174941c38f151ea7083c658da3Chet Haase private static final int TOGETHER = 0; 45f54a8d7c479485174941c38f151ea7083c658da3Chet Haase private static final int SEQUENTIALLY = 1; 46f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 47f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current animation time in milliseconds. This time should be used when invoking 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Animation#setStartTime(long)}. Refer to {@link android.os.SystemClock} for more 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information about the different available clocks. The clock used by this method is 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>not</em> the "wall" clock (it is not {@link System#currentTimeMillis}). 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current animation time in milliseconds 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.os.SystemClock 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static long currentAnimationTimeMillis() { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return SystemClock.uptimeMillis(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Loads an {@link Animation} object from a resource 64f54a8d7c479485174941c38f151ea7083c658da3Chet Haase * 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Application context used to access resources 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The resource id of the animation to load 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The animation object reference by the specified id 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException when the animation cannot be loaded 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 707b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public static Animation loadAnimation(Context context, @AnimRes int id) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws NotFoundException { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = context.getResources().getAnimation(id); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createAnimationFromXml(context, parser); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException ex) { 788b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 798b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru Integer.toHexString(id)); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(ex); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ex) { 838b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 848b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru Integer.toHexString(id)); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(ex); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Animation createAnimationFromXml(Context c, XmlPullParser parser) 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 948b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createAnimationFromXml(c, parser, null, Xml.asAttributeSet(parser)); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 97f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 988b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru private static Animation createAnimationFromXml(Context c, XmlPullParser parser, 998b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru AnimationSet parent, AttributeSet attrs) throws XmlPullParserException, IOException { 100f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation anim = null; 102f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure we are on a start tag. 1048b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru int type; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int depth = parser.getDepth(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != XmlPullParser.END_DOCUMENT) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != XmlPullParser.START_TAG) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = parser.getName(); 115f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.equals("set")) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = new AnimationSet(c, attrs); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createAnimationFromXml(c, parser, (AnimationSet)anim, attrs); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (name.equals("alpha")) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = new AlphaAnimation(c, attrs); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (name.equals("scale")) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = new ScaleAnimation(c, attrs); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (name.equals("rotate")) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = new RotateAnimation(c, attrs); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (name.equals("translate")) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anim = new TranslateAnimation(c, attrs); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unknown animation name: " + parser.getName()); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent.addAnimation(anim); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 135f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 136f54a8d7c479485174941c38f151ea7083c658da3Chet Haase return anim; 137f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 138f54a8d7c479485174941c38f151ea7083c658da3Chet Haase } 139f54a8d7c479485174941c38f151ea7083c658da3Chet Haase 1402d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase /** 1412d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase * Loads a {@link LayoutAnimationController} object from a resource 1422d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase * 1432d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase * @param context Application context used to access resources 1442d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase * @param id The resource id of the animation to load 1452d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase * @return The animation object reference by the specified id 1462d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase * @throws NotFoundException when the layout animation controller cannot be loaded 1472d46fcc669ff5efe365e9be435ab9e5c5a304939Chet Haase */ 1487b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye public static LayoutAnimationController loadLayoutAnimation(Context context, @AnimRes int id) 1498b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru throws NotFoundException { 150e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = context.getResources().getAnimation(id); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createLayoutAnimationFromXml(context, parser); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException ex) { 1568b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 1578b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru Integer.toHexString(id)); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(ex); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ex) { 1618b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 1628b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru Integer.toHexString(id)); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(ex); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1708b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru private static LayoutAnimationController createLayoutAnimationFromXml(Context c, 1718b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru XmlPullParser parser) throws XmlPullParserException, IOException { 1728b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru 1738b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru return createLayoutAnimationFromXml(c, parser, Xml.asAttributeSet(parser)); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1768b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru private static LayoutAnimationController createLayoutAnimationFromXml(Context c, 1778b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru XmlPullParser parser, AttributeSet attrs) throws XmlPullParserException, IOException { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutAnimationController controller = null; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int depth = parser.getDepth(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1848b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != XmlPullParser.END_DOCUMENT) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != XmlPullParser.START_TAG) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = parser.getName(); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("layoutAnimation".equals(name)) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project controller = new LayoutAnimationController(c, attrs); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ("gridLayoutAnimation".equals(name)) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project controller = new GridLayoutAnimationController(c, attrs); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1988b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru throw new RuntimeException("Unknown layout animation name: " + name); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return controller; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Make an animation for objects becoming visible. Uses a slide and fade 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * effect. 208e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context for loading resources 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fromLeft is the object to be animated coming from the left 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The new animation 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2138b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public static Animation makeInAnimation(Context c, boolean fromLeft) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fromLeft) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(c, com.android.internal.R.anim.slide_in_left); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(c, com.android.internal.R.anim.slide_in_right); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setInterpolator(new DecelerateInterpolator()); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setStartTime(currentAnimationTimeMillis()); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 225e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Make an animation for objects becoming invisible. Uses a slide and fade 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * effect. 229e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context for loading resources 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param toRight is the object to be animated exiting to the right 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The new animation 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2348b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public static Animation makeOutAnimation(Context c, boolean toRight) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (toRight) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(c, com.android.internal.R.anim.slide_out_right); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(c, com.android.internal.R.anim.slide_out_left); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 241e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setInterpolator(new AccelerateInterpolator()); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setStartTime(currentAnimationTimeMillis()); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 247e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Make an animation for objects becoming visible. Uses a slide up and fade 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * effect. 251e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c Context for loading resources 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The new animation 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2558b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru public static Animation makeInChildBottomAnimation(Context c) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a = AnimationUtils.loadAnimation(c, com.android.internal.R.anim.slide_in_child_bottom); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setInterpolator(new AccelerateInterpolator()); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.setStartTime(currentAnimationTimeMillis()); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 262e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Loads an {@link Interpolator} object from a resource 265e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Application context used to access resources 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id The resource id of the animation to load 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The animation object reference by the specified id 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws NotFoundException 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 271e8760544cf57a6005d7e0c9bfd3cec859902e69dTor Norbye public static Interpolator loadInterpolator(Context context, @AnimRes @InterpolatorRes int id) 2727b9c912f536925ac6ec43935d6e97506851b33d6Tor Norbye throws NotFoundException { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = context.getResources().getAnimation(id); 276e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui return createInterpolatorFromXml(context.getResources(), context.getTheme(), parser); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException ex) { 2788b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 2798b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru Integer.toHexString(id)); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(ex); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ex) { 2838b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 2848b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru Integer.toHexString(id)); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rnf.initCause(ex); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw rnf; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 292e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 293e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui /** 294e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * Loads an {@link Interpolator} object from a resource 295e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 296e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @param res The resources 297e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @param id The resource id of the animation to load 298e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @return The interpolator object reference by the specified id 299e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @throws NotFoundException 300e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @hide 301e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui */ 302e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui public static Interpolator loadInterpolator(Resources res, Theme theme, int id) throws NotFoundException { 303e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui XmlResourceParser parser = null; 304e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui try { 305e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui parser = res.getAnimation(id); 306e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui return createInterpolatorFromXml(res, theme, parser); 307e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui } catch (XmlPullParserException ex) { 308e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 309e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui Integer.toHexString(id)); 310e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui rnf.initCause(ex); 311e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui throw rnf; 312e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui } catch (IOException ex) { 313e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 314e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui Integer.toHexString(id)); 315e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui rnf.initCause(ex); 316e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui throw rnf; 317e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui } finally { 318e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui if (parser != null) 319e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui parser.close(); 320e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui } 321e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 322e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui } 323e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 324e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui private static Interpolator createInterpolatorFromXml(Resources res, Theme theme, XmlPullParser parser) 3258b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru throws XmlPullParserException, IOException { 326e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 327d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar BaseInterpolator interpolator = null; 328e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make sure we are on a start tag. 3308b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru int type; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int depth = parser.getDepth(); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 333e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 334e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui && type != XmlPullParser.END_DOCUMENT) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != XmlPullParser.START_TAG) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = Xml.asAttributeSet(parser); 341e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 342e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui String name = parser.getName(); 343e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.equals("linearInterpolator")) { 345e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new LinearInterpolator(); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (name.equals("accelerateInterpolator")) { 347e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new AccelerateInterpolator(res, theme, attrs); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (name.equals("decelerateInterpolator")) { 349e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new DecelerateInterpolator(res, theme, attrs); 350e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui } else if (name.equals("accelerateDecelerateInterpolator")) { 351e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new AccelerateDecelerateInterpolator(); 352e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui } else if (name.equals("cycleInterpolator")) { 353e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new CycleInterpolator(res, theme, attrs); 3548b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } else if (name.equals("anticipateInterpolator")) { 355e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new AnticipateInterpolator(res, theme, attrs); 3568b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } else if (name.equals("overshootInterpolator")) { 357e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new OvershootInterpolator(res, theme, attrs); 3588b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } else if (name.equals("anticipateOvershootInterpolator")) { 359e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new AnticipateOvershootInterpolator(res, theme, attrs); 3608b0662878eae69ab62e859b07165f086ea65cad5Jean-Baptiste Queru } else if (name.equals("bounceInterpolator")) { 361e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new BounceInterpolator(); 3626e5f045ddfd779ee5059765df6180b961ea88c2aGeorge Mount } else if (name.equals("pathInterpolator")) { 363e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui interpolator = new PathInterpolator(res, theme, attrs); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unknown interpolator name: " + parser.getName()); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return interpolator; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 371