1b77813a5dbce67e7ecb457e39900b82f04def8beztenghui/* 2b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Copyright (C) 2017 The Android Open Source Project 3b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * 4b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Licensed under the Apache License, Version 2.0 (the "License"); 5b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * you may not use this file except in compliance with the License. 6b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * You may obtain a copy of the License at 7b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * 8b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * http://www.apache.org/licenses/LICENSE-2.0 9b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * 10b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Unless required by applicable law or agreed to in writing, software 11b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * distributed under the License is distributed on an "AS IS" BASIS, 12b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * See the License for the specific language governing permissions and 14b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * limitations under the License. 15b77813a5dbce67e7ecb457e39900b82f04def8beztenghui */ 16b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 17b77813a5dbce67e7ecb457e39900b82f04def8beztenghuipackage android.support.graphics.drawable; 18b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 19b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP; 20b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 21b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.Context; 22b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.Resources; 23b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.Resources.NotFoundException; 24b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.Resources.Theme; 25b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.content.res.XmlResourceParser; 26b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.os.Build; 27b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.annotation.RestrictTo; 28b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.v4.view.animation.FastOutLinearInInterpolator; 29b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.v4.view.animation.FastOutSlowInInterpolator; 30b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.support.v4.view.animation.LinearOutSlowInInterpolator; 31b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.util.AttributeSet; 32b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.util.Xml; 33b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AccelerateDecelerateInterpolator; 34b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AccelerateInterpolator; 35b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AnimationUtils; 36b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AnticipateInterpolator; 37b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.AnticipateOvershootInterpolator; 38b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.BounceInterpolator; 39b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.CycleInterpolator; 40b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.DecelerateInterpolator; 41b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.Interpolator; 42b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.LinearInterpolator; 43b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport android.view.animation.OvershootInterpolator; 44b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 45b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport org.xmlpull.v1.XmlPullParser; 46b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport org.xmlpull.v1.XmlPullParserException; 47b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 48b77813a5dbce67e7ecb457e39900b82f04def8beztenghuiimport java.io.IOException; 49b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 50b77813a5dbce67e7ecb457e39900b82f04def8beztenghui/** 51b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Defines common utilities for working with animations. 52b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * @hide 53b77813a5dbce67e7ecb457e39900b82f04def8beztenghui */ 54b77813a5dbce67e7ecb457e39900b82f04def8beztenghui@RestrictTo(LIBRARY_GROUP) 55b77813a5dbce67e7ecb457e39900b82f04def8beztenghuipublic class AnimationUtilsCompat { 56b77813a5dbce67e7ecb457e39900b82f04def8beztenghui /** 57b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * Loads an {@link Interpolator} object from a resource 58b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * 59b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * @param context Application context used to access resources 60b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * @param id The resource id of the animation to load 61b77813a5dbce67e7ecb457e39900b82f04def8beztenghui * @return The animation object reference by the specified id 62b77813a5dbce67e7ecb457e39900b82f04def8beztenghui */ 63b77813a5dbce67e7ecb457e39900b82f04def8beztenghui public static Interpolator loadInterpolator(Context context, int id) 64b77813a5dbce67e7ecb457e39900b82f04def8beztenghui throws NotFoundException { 65b77813a5dbce67e7ecb457e39900b82f04def8beztenghui // From API 21, we added path Interpolator . 66b77813a5dbce67e7ecb457e39900b82f04def8beztenghui if (Build.VERSION.SDK_INT >= 21) { 67b77813a5dbce67e7ecb457e39900b82f04def8beztenghui return AnimationUtils.loadInterpolator(context, id); 68b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 69b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 70b77813a5dbce67e7ecb457e39900b82f04def8beztenghui XmlResourceParser parser = null; 71b77813a5dbce67e7ecb457e39900b82f04def8beztenghui try { 72b77813a5dbce67e7ecb457e39900b82f04def8beztenghui // Special treatment for the interpolator introduced at API 21. 73b77813a5dbce67e7ecb457e39900b82f04def8beztenghui if (id == AndroidResources.FAST_OUT_LINEAR_IN) { 74b77813a5dbce67e7ecb457e39900b82f04def8beztenghui return new FastOutLinearInInterpolator(); 75b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (id == AndroidResources.FAST_OUT_SLOW_IN) { 76b77813a5dbce67e7ecb457e39900b82f04def8beztenghui return new FastOutSlowInInterpolator(); 77b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (id == AndroidResources.LINEAR_OUT_SLOW_IN) { 78b77813a5dbce67e7ecb457e39900b82f04def8beztenghui return new LinearOutSlowInInterpolator(); 79b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 80b77813a5dbce67e7ecb457e39900b82f04def8beztenghui parser = context.getResources().getAnimation(id); 81b77813a5dbce67e7ecb457e39900b82f04def8beztenghui return createInterpolatorFromXml(context, context.getResources(), context.getTheme(), 82b77813a5dbce67e7ecb457e39900b82f04def8beztenghui parser); 83b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } catch (XmlPullParserException ex) { 84b77813a5dbce67e7ecb457e39900b82f04def8beztenghui NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" 85b77813a5dbce67e7ecb457e39900b82f04def8beztenghui + Integer.toHexString(id)); 86b77813a5dbce67e7ecb457e39900b82f04def8beztenghui rnf.initCause(ex); 87b77813a5dbce67e7ecb457e39900b82f04def8beztenghui throw rnf; 88b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } catch (IOException ex) { 89b77813a5dbce67e7ecb457e39900b82f04def8beztenghui NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" 90b77813a5dbce67e7ecb457e39900b82f04def8beztenghui + Integer.toHexString(id)); 91b77813a5dbce67e7ecb457e39900b82f04def8beztenghui rnf.initCause(ex); 92b77813a5dbce67e7ecb457e39900b82f04def8beztenghui throw rnf; 93b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } finally { 94b77813a5dbce67e7ecb457e39900b82f04def8beztenghui if (parser != null) parser.close(); 95b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 96b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 97b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 98b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 99b77813a5dbce67e7ecb457e39900b82f04def8beztenghui private static Interpolator createInterpolatorFromXml(Context context, Resources res, 100b77813a5dbce67e7ecb457e39900b82f04def8beztenghui Theme theme, 101b77813a5dbce67e7ecb457e39900b82f04def8beztenghui XmlPullParser parser) 102b77813a5dbce67e7ecb457e39900b82f04def8beztenghui throws XmlPullParserException, IOException { 103b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 104b77813a5dbce67e7ecb457e39900b82f04def8beztenghui Interpolator interpolator = null; 105b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 106b77813a5dbce67e7ecb457e39900b82f04def8beztenghui // Make sure we are on a start tag. 107b77813a5dbce67e7ecb457e39900b82f04def8beztenghui int type; 108b77813a5dbce67e7ecb457e39900b82f04def8beztenghui int depth = parser.getDepth(); 109b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 110b77813a5dbce67e7ecb457e39900b82f04def8beztenghui while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 111b77813a5dbce67e7ecb457e39900b82f04def8beztenghui && type != XmlPullParser.END_DOCUMENT) { 112b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 113b77813a5dbce67e7ecb457e39900b82f04def8beztenghui if (type != XmlPullParser.START_TAG) { 114b77813a5dbce67e7ecb457e39900b82f04def8beztenghui continue; 115b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 116b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 117b77813a5dbce67e7ecb457e39900b82f04def8beztenghui AttributeSet attrs = Xml.asAttributeSet(parser); 118b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 119b77813a5dbce67e7ecb457e39900b82f04def8beztenghui String name = parser.getName(); 120b77813a5dbce67e7ecb457e39900b82f04def8beztenghui 121b77813a5dbce67e7ecb457e39900b82f04def8beztenghui if (name.equals("linearInterpolator")) { 122b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new LinearInterpolator(); 123b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("accelerateInterpolator")) { 124b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new AccelerateInterpolator(context, attrs); 125b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("decelerateInterpolator")) { 126b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new DecelerateInterpolator(context, attrs); 127b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("accelerateDecelerateInterpolator")) { 128b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new AccelerateDecelerateInterpolator(); 129b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("cycleInterpolator")) { 130b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new CycleInterpolator(context, attrs); 131b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("anticipateInterpolator")) { 132b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new AnticipateInterpolator(context, attrs); 133b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("overshootInterpolator")) { 134b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new OvershootInterpolator(context, attrs); 135b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("anticipateOvershootInterpolator")) { 136b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new AnticipateOvershootInterpolator(context, attrs); 137b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("bounceInterpolator")) { 138b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new BounceInterpolator(); 139b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else if (name.equals("pathInterpolator")) { 140b77813a5dbce67e7ecb457e39900b82f04def8beztenghui interpolator = new PathInterpolatorCompat(context, attrs, parser); 141b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } else { 142b77813a5dbce67e7ecb457e39900b82f04def8beztenghui throw new RuntimeException("Unknown interpolator name: " + parser.getName()); 143b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 144b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 145b77813a5dbce67e7ecb457e39900b82f04def8beztenghui return interpolator; 146b77813a5dbce67e7ecb457e39900b82f04def8beztenghui } 147b77813a5dbce67e7ecb457e39900b82f04def8beztenghui} 148