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.graphics.drawable; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 197dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craikimport android.annotation.NonNull; 20e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viveretteimport android.content.res.ColorStateList; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 2252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 2478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Bitmap; 2578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.BitmapFactory; 2678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas; 27b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Color; 2878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter; 29b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Insets; 3078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.NinePatch; 31b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikimport android.graphics.Outline; 3278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat; 3378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuff; 34b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode; 3578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuffColorFilter; 3678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect; 3778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Region; 38b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Xfermode; 39b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.os.Trace; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 4111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackbornimport android.util.DisplayMetrics; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.StateSet; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 4478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.util.Xml; 45d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbyeimport android.view.View; 4678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne 47b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport org.xmlpull.v1.XmlPullParser; 48b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport org.xmlpull.v1.XmlPullParserException; 49b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 5078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.IOException; 5178aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.InputStream; 52f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guyimport java.lang.ref.WeakReference; 5378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.util.Arrays; 54dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable is a general abstraction for "something that can be drawn." Most 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * often you will deal with Drawable as the type of resource retrieved for 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing things to the screen; the Drawable class provides a generic API for 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dealing with an underlying visual resource that may take a variety of forms. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike a {@link android.view.View}, a Drawable does not have any facility to 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive events or otherwise interact with the user. 6323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In addition to simple drawing, Drawable provides a number of generic 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mechanisms for its client to interact with what is being drawn: 6623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #setBounds} method <var>must</var> be called to tell the 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable where it is drawn and how large it should be. All Drawables 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should respect the requested size, often simply by scaling their 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * imagery. A client can find the preferred size for some Drawables with 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #getIntrinsicHeight} and {@link #getIntrinsicWidth} methods. 7323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #getPadding} method can return from some Drawables 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information about how to frame content that is placed inside of them. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example, a Drawable that is intended to be the frame for a button 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * widget would need to return padding that correctly places the label 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inside of itself. 7923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #setState} method allows the client to tell the Drawable 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in which state it is to be drawn, such as "focused", "selected", etc. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Some drawables may modify their imagery based on the selected state. 8323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #setLevel} method allows the client to supply a single 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * continuous controller that can modify the Drawable is displayed, such as 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a battery level or progress level. Some drawables may modify their 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * imagery based on the current level. 8823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> A Drawable can perform animations by calling back to its client 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * through the {@link Callback} interface. All clients should support this 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface (via {@link #setCallback}) so that animations will work. A 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simple way to do this is through the system facilities such as 93d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * {@link android.view.View#setBackground(Drawable)} and 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ImageView}. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 9623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Though usually not visible to the application, Drawables may take a variety 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of forms: 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Bitmap</b>: the simplest Drawable, a PNG or JPEG image. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Nine Patch</b>: an extension to the PNG format allows it to 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specify information about how to stretch it and place things inside of 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Shape</b>: contains simple drawing commands instead of a raw 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bitmap, allowing it to resize better in some cases. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Layers</b>: a compound drawable, which draws multiple underlying 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables on top of each other. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>States</b>: a compound drawable that selects one of a set of 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables based on its state. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Levels</b>: a compound drawable that selects one of a set of 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables based on its level. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Scale</b>: a compound drawable with a single child drawable, 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whose overall size is modified based on the current level. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 11661fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * 11761fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <div class="special reference"> 11861fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <h3>Developer Guides</h3> 11961fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <p>For more information about how to use drawables, read the 12061fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html">Canvas and Drawables</a> developer 12161fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * guide. For information and examples of creating drawable resources (XML or bitmap files that 12261fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * can be loaded in code), read the 12361fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a> 12461fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * document.</p></div> 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Drawable { 12723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy private static final Rect ZERO_BOUNDS_RECT = new Rect(); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 129607bd848269fb802550e63aa61945790616f97a7Alan Viverette static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN; 130607bd848269fb802550e63aa61945790616f97a7Alan Viverette 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mStateSet = StateSet.WILD_CARD; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLevel = 0; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mChangingConfigurations = 0; 1340f07b2c850ee1462ca4cf3137a954a9fc4bdf773Brad Fitzpatrick private Rect mBounds = ZERO_BOUNDS_RECT; // lazily becomes a new Rect() 135f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy private WeakReference<Callback> mCallback = null; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mVisible = true; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 138b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio private int mLayoutDirection; 139b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw in its bounds (set via setBounds) respecting optional effects such 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as alpha (set via setAlpha) and color filter (set via setColorFilter). 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param canvas The canvas to draw into 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14616f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette public abstract void draw(Canvas canvas); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify a bounding rectangle for the Drawable. This is where the drawable 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will draw when its draw() method is called. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBounds(int left, int top, int right, int bottom) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect oldBounds = mBounds; 15423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 15523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy if (oldBounds == ZERO_BOUNDS_RECT) { 15623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy oldBounds = mBounds = new Rect(); 15723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy } 15823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldBounds.left != left || oldBounds.top != top || 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldBounds.right != right || oldBounds.bottom != bottom) { 16116f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette if (!oldBounds.isEmpty()) { 16216f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette // first invalidate the previous bounds 16316f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette invalidateSelf(); 164633326e29f008d2b86e523cfeedcbb2a0883181fChet Haase } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBounds.set(left, top, right, bottom); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onBoundsChange(mBounds); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify a bounding rectangle for the Drawable. This is where the drawable 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will draw when its draw() method is called. 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBounds(Rect bounds) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBounds(bounds.left, bounds.top, bounds.right, bounds.bottom); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a copy of the drawable's bounds in the specified Rect (allocated 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the caller). The bounds specify where this will draw when its draw() 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is called. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bounds Rect to receive the drawable's bounds (allocated by the 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * caller). 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void copyBounds(Rect bounds) { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.set(mBounds); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a copy of the drawable's bounds in a new Rect. This returns the 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * same values as getBounds(), but the returned object is guaranteed to not 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be changed later by the drawable (i.e. it retains no reference to this 19423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * rect). If the caller already has a Rect allocated, call copyBounds(rect). 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A copy of the drawable's bounds 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Rect copyBounds() { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Rect(mBounds); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the drawable's bounds Rect. Note: for efficiency, the returned 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object may be the same object stored in the drawable (though this is not 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * guaranteed), so if a persistent copy of the bounds is needed, call 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * copyBounds(rect) instead. 20723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * You should also not change the object returned by this method as it may 20823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * be the same object stored in the drawable. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The bounds of the drawable (which may change later, so caller 21123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * beware). DO NOT ALTER the returned object as it may change the 21223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * stored bounds of this drawable. 21323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 21423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * @see #copyBounds() 215e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #copyBounds(android.graphics.Rect) 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Rect getBounds() { 21823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy if (mBounds == ZERO_BOUNDS_RECT) { 21923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy mBounds = new Rect(); 22023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy } 22123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBounds; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 226d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * Return the drawable's dirty bounds Rect. Note: for efficiency, the 227d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * returned object may be the same object stored in the drawable (though 228d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * this is not guaranteed). 229d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * <p> 230d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * By default, this returns the full drawable bounds. Custom drawables may 231d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * override this method to perform more precise invalidation. 232d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * 233e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viverette * @return The dirty bounds of this drawable 234d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette */ 235d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette public Rect getDirtyBounds() { 236d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette return getBounds(); 237d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette } 238d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette 239d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette /** 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set a mask of the configuration parameters for which this drawable 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may change, requiring that it be re-created. 24223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param configs A mask of the changing configuration parameters, as 2448e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * defined by {@link android.content.pm.ActivityInfo}. 24523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 2468e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * @see android.content.pm.ActivityInfo 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChangingConfigurations(int configs) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChangingConfigurations = configs; 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a mask of the configuration parameters for which this drawable 25469ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick * may change, requiring that it be re-created. The default implementation 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns whatever was provided through 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setChangingConfigurations(int)} or 0 by default. Subclasses 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may extend this to or in the changing configurations of any other 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables they hold. 25923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a mask of the changing configuration parameters, as 2618e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * defined by {@link android.content.pm.ActivityInfo}. 26223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 2638e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * @see android.content.pm.ActivityInfo 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChangingConfigurations; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set to true to have the drawable dither its colors when drawn to a device 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with fewer than 8-bits per color component. This can improve the look on 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * those devices, but can also slow down the drawing a little. 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) {} 27523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set to true to have the drawable filter its bitmap when scaled or rotated 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (for drawables that use bitmaps). If the drawable does not use bitmaps, 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this call is ignored. This can improve the look when scaled or rotated, 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but also slows down the drawing. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFilterBitmap(boolean filter) {} 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implement this interface if you want to create an animated drawable that 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extends {@link android.graphics.drawable.Drawable Drawable}. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Upon retrieving a drawable, use 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setCallback(android.graphics.drawable.Drawable.Callback)} 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to supply your implementation of the interface to the drawable; it uses 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this interface to schedule and execute animation changes. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Callback { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the drawable needs to be redrawn. A view at this point 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should invalidate itself (or at least the part of itself where the 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawable appears). 29723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param who The drawable that is requesting the update. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void invalidateDrawable(Drawable who); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable can call this to schedule the next frame of its 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation. An implementation can generally simply call 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.Handler#postAtTime(Runnable, Object, long)} with 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parameters <var>(what, who, when)</var> to perform the 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scheduling. 30823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param who The drawable being scheduled. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The action to execute. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param when The time (in milliseconds) to run. The timebase is 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#uptimeMillis} 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void scheduleDrawable(Drawable who, Runnable what, long when); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable can call this to unschedule an action previously 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scheduled with {@link #scheduleDrawable}. An implementation can 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * generally simply call 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.Handler#removeCallbacks(Runnable, Object)} with 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parameters <var>(what, who)</var> to unschedule the drawable. 32223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param who The drawable being unscheduled. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The action being unscheduled. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unscheduleDrawable(Drawable who, Runnable what); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bind a {@link Callback} object to this Drawable. Required for clients 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that want to support animated drawables. 33223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cb The client's Callback implementation. 334e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 335e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #getCallback() 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void setCallback(Callback cb) { 338f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy mCallback = new WeakReference<Callback>(cb); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 342f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy * Return the current {@link Callback} implementation attached to this 343f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy * Drawable. 344e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 345f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy * @return A {@link Callback} instance or null if no callback was set. 346e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 347e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #setCallback(android.graphics.drawable.Drawable.Callback) 348f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy */ 349f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy public Callback getCallback() { 350f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (mCallback != null) { 351f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy return mCallback.get(); 352f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy } 353f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy return null; 354f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy } 355e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 356f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy /** 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use the current {@link Callback} implementation to have this Drawable 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * redrawn. Does nothing if there is no Callback attached to the 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable. 36023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Callback#invalidateDrawable 362e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #getCallback() 363e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #setCallback(android.graphics.drawable.Drawable.Callback) 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 365f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy public void invalidateSelf() { 366f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy final Callback callback = getCallback(); 367f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (callback != null) { 368f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy callback.invalidateDrawable(this); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use the current {@link Callback} implementation to have this Drawable 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scheduled. Does nothing if there is no Callback attached to the 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable. 37623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The action being scheduled. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param when The time (in milliseconds) to run. 37923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Callback#scheduleDrawable 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 382f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy public void scheduleSelf(Runnable what, long when) { 383f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy final Callback callback = getCallback(); 384f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (callback != null) { 385f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy callback.scheduleDrawable(this, what, when); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use the current {@link Callback} implementation to have this Drawable 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unscheduled. Does nothing if there is no Callback attached to the 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable. 39323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The runnable that you no longer want called. 39523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Callback#unscheduleDrawable 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 398f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy public void unscheduleSelf(Runnable what) { 399f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy final Callback callback = getCallback(); 400f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (callback != null) { 401f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy callback.unscheduleDrawable(this, what); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 406b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * Returns the resolved layout direction for this Drawable. 407b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * 408c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio * @return One of {@link android.view.View#LAYOUT_DIRECTION_LTR}, 409c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio * {@link android.view.View#LAYOUT_DIRECTION_RTL} 410f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio * 411f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio * @hide 412c1da65187a4b9de8f72bd617ef937030187c0a92Fabrice Di Meglio */ 413b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio public int getLayoutDirection() { 414b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio return mLayoutDirection; 415b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio } 416b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio 417b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio /** 418b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * Set the layout direction for this drawable. Should be a resolved direction as the 419b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * Drawable as no capacity to do the resolution on his own. 420b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * 421c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio * @param layoutDirection One of {@link android.view.View#LAYOUT_DIRECTION_LTR}, 422f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio * {@link android.view.View#LAYOUT_DIRECTION_RTL} 423b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * 424f358260af4cd34961acc13d849819c8b6089f309Fabrice Di Meglio * @hide 425b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio */ 426d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbye public void setLayoutDirection(@View.ResolvedLayoutDir int layoutDirection) { 427b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio if (getLayoutDirection() != layoutDirection) { 428b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio mLayoutDirection = layoutDirection; 4296a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio } 4306a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio } 4316a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio 4326a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio /** 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify an alpha value for the drawable. 0 means fully transparent, and 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 255 means fully opaque. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void setAlpha(int alpha); 43723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 439b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * Gets the current alpha value for the drawable. 0 means fully transparent, 440b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * 255 means fully opaque. This method is implemented by 441b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * Drawable subclasses and the value returned is specific to how that class treats alpha. 442b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * The default return value is 255 if the class does not override this method to return a value 443b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * specific to its use of alpha. 444b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase */ 445b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase public int getAlpha() { 446b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase return 0xFF; 447b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase } 448b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase 449b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase /** 45031049d76c55b18a6d9993f0d9687598740b16014Adam Powell * @hide Consider for future API inclusion 45131049d76c55b18a6d9993f0d9687598740b16014Adam Powell */ 45231049d76c55b18a6d9993f0d9687598740b16014Adam Powell public void setXfermode(Xfermode mode) { 45331049d76c55b18a6d9993f0d9687598740b16014Adam Powell // Base implementation drops it on the floor for compatibility. Whee! 45431049d76c55b18a6d9993f0d9687598740b16014Adam Powell // TODO: For this to be included in the API proper, all framework drawables need impls. 45531049d76c55b18a6d9993f0d9687598740b16014Adam Powell // For right now only BitmapDrawable has it. 45631049d76c55b18a6d9993f0d9687598740b16014Adam Powell } 45731049d76c55b18a6d9993f0d9687598740b16014Adam Powell 45831049d76c55b18a6d9993f0d9687598740b16014Adam Powell /** 459813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * Specify an optional color filter for the drawable. Pass {@code null} to 460813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * remove any existing color filter. 461813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * 462813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * @param cf the color filter to apply, or {@code null} to remove the 463813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * existing color filter 464813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette */ 465813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette public abstract void setColorFilter(ColorFilter cf); 466813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette 467813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette /** 468d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * Specify a color and Porter-Duff mode to be the color filter for this 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawable. 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setColorFilter(int color, PorterDuff.Mode mode) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setColorFilter(new PorterDuffColorFilter(color, mode)); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 475d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette /** 476a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * Specifies a tint for this drawable. 477a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * <p> 478a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides 479a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * tint. 480a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * 481a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @param tint Color to use for tinting this drawable 482a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see #setTintMode(PorterDuff.Mode) 483a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette */ 484a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTint(int tint) { 485a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette setTintList(ColorStateList.valueOf(tint)); 486a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 487a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 488a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette /** 489a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * Specifies a tint for this drawable as a color state list. 490a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * <p> 491a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides 492a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * tint. 493a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * 494a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @param tint Color state list to use for tinting this drawable, or null to 495a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * clear the tint 496a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see #setTintMode(PorterDuff.Mode) 497a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette */ 498a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintList(ColorStateList tint) {} 499a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 500a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette /** 501a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * Specifies a tint blending mode for this drawable. 502a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * <p> 503a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides 504a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * tint. 505a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * 506a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @param tintMode Color state list to use for tinting this drawable, or null to 507a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * clear the tint 508a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @param tintMode A Porter-Duff blending mode 509a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette */ 510a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette public void setTintMode(PorterDuff.Mode tintMode) {} 511a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 512a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette /** 513813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * Returns the current color filter, or {@code null} if none set. 514813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * 515813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * @return the current color filter, or {@code null} if none set 516813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette */ 517813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette public ColorFilter getColorFilter() { 518813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette return null; 519813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette } 520813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette 521813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette /** 522d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * Removes the color filter for this drawable. 523d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette */ 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearColorFilter() { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setColorFilter(null); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 529c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * Specifies the hotspot's location within the drawable. 530223622a50db319d634616311ff74267cf49679e7Alan Viverette * 531860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette * @param x The X coordinate of the center of the hotspot 532860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette * @param y The Y coordinate of the center of the hotspot 533223622a50db319d634616311ff74267cf49679e7Alan Viverette */ 534c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette public void setHotspot(float x, float y) {} 535223622a50db319d634616311ff74267cf49679e7Alan Viverette 536223622a50db319d634616311ff74267cf49679e7Alan Viverette /** 537c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * Sets the bounds to which the hotspot is constrained, if they should be 538c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * different from the drawable bounds. 53953a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette * 540c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * @param left 541c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * @param top 542c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * @param right 543c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * @param bottom 54461956606818918194a38e045a8e35e7108480e5eAlan Viverette */ 54561956606818918194a38e045a8e35e7108480e5eAlan Viverette public void setHotspotBounds(int left, int top, int right, int bottom) {} 546223622a50db319d634616311ff74267cf49679e7Alan Viverette 5477068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette /** @hide For internal use only. Individual results may vary. */ 5487068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette public void getHotspotBounds(Rect outRect) { 5497068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette outRect.set(getBounds()); 5507068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 5517068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 552223622a50db319d634616311ff74267cf49679e7Alan Viverette /** 553d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * Whether this drawable requests projection. 554d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * 555c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * @hide magic! 556d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette */ 557d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette public boolean isProjected() { 558d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette return false; 559d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette } 560d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette 561d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette /** 5623b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * Indicates whether this drawable will change its appearance based on 5633b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * state. Clients can use this to determine whether it is necessary to 5643b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * calculate their state and call setState. 56523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 5663b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * @return True if this drawable changes its appearance based on state, 5673b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * false otherwise. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setState(int[]) 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStateful() { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify a set of states for the drawable. These are use-case specific, 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * so see the relevant documentation. As an example, the background for 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * widgets like Button understand the following states: 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * [{@link android.R.attr#state_focused}, 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_pressed}]. 58023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the new state you are supplying causes the appearance of the 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable to change, then it is responsible for calling 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em> 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * true will be returned from this function. 58523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note: The Drawable holds a reference on to <var>stateSet</var> 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * until a new state array is given to it, so you must not modify this 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array during that time.</p> 58923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stateSet The new set of states to be displayed. 59123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if this change in state has caused the appearance 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the Drawable to change (hence requiring an invalidate), otherwise 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false. 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setState(final int[] stateSet) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Arrays.equals(mStateSet, stateSet)) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStateSet = stateSet; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return onStateChange(stateSet); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Describes the current state, as a union of primitve states, such as 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_focused}, 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_selected}, etc. 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Some drawables may modify their imagery based on the selected state. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An array of resource Ids describing the current state. 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int[] getState() { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStateSet; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 61423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 616079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * If this Drawable does transition animations between states, ask that 617079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * it immediately jump to the current state and skip any active animations. 618079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 619079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void jumpToCurrentState() { 620079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 621079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 622079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current drawable that will be used by this drawable. For simple drawables, this 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is just the drawable itself. For drawables that change state like 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link StateListDrawable} and {@link LevelListDrawable} this will be the child drawable 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently in use. 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getCurrent() { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify the level for the drawable. This allows a drawable to vary its 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * imagery based on a continuous controller, for example to show progress 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or volume level. 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the new level you are supplying causes the appearance of the 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable to change, then it is responsible for calling 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em> 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * true will be returned from this function. 64123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level The new level, from 0 (minimum) to 10000 (maximum). 64323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if this change in level has caused the appearance 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the Drawable to change (hence requiring an invalidate), otherwise 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false. 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean setLevel(int level) { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLevel != level) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLevel = level; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return onLevelChange(level); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the current level. 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int Current level, from 0 (minimum) to 10000 (maximum). 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getLevel() { 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLevel; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set whether this Drawable is visible. This generally does not impact 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the Drawable's behavior, but is a hint that can be used by some 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawables, for example, to decide whether run animations. 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visible Set to true if visible, false if not. 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param restart You can supply true here to force the drawable to behave 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as if it has just become visible, even if it had last 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been set visible. Used for example to force animations 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to restart. 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return boolean Returns true if the new visibility is different than 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its previous state. 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setVisible(boolean visible, boolean restart) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = mVisible != visible; 6819891e1fce5f29d0421d34aa481037417bd70853dChet Haase if (changed) { 6829891e1fce5f29d0421d34aa481037417bd70853dChet Haase mVisible = visible; 6839891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 6849891e1fce5f29d0421d34aa481037417bd70853dChet Haase } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isVisible() { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mVisible; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6933f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * Set whether this Drawable is automatically mirrored when its layout direction is RTL 6943f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * (right-to left). See {@link android.util.LayoutDirection}. 6953f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * 6963f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * @param mirrored Set to true if the Drawable should be mirrored, false if not. 6973f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio */ 6983f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public void setAutoMirrored(boolean mirrored) { 6993f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 7003f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 7013f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio /** 7023f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * Tells if this Drawable will be automatically mirrored when its layout direction is RTL 7033f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * right-to-left. See {@link android.util.LayoutDirection}. 7043f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * 7053f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * @return boolean Returns true if this Drawable will be automatically mirrored. 7063f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio */ 7073f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public boolean isAutoMirrored() { 7083f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio return false; 7093f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 7103f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 7113f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio /** 71252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Applies the specified theme to this Drawable and its children. 71352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 71452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public void applyTheme(@SuppressWarnings("unused") Theme t) { 71552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 71652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 71752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 71852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 71952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 72052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 72152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the opacity/transparency of this Drawable. The returned value is 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one of the abstract format constants in 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat}: 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#UNKNOWN}, 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#TRANSLUCENT}, 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#TRANSPARENT}, or 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#OPAQUE}. 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Generally a Drawable should be as conservative as possible with the 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value it returns. For example, if it contains multiple child drawables 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and only shows one of them at a time, if only one of the children is 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TRANSLUCENT and the others are OPAQUE then TRANSLUCENT should be 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned. You can use the method {@link #resolveOpacity} to perform a 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard reduction of two opacities to the appropriate single output. 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note that the returned value does <em>not</em> take into account a 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * custom alpha or color filter that has been applied by the client through 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #setAlpha} or {@link #setColorFilter} methods. 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int The opacity class of the Drawable. 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.graphics.PixelFormat 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getOpacity(); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the appropriate opacity value for two source opacities. If 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either is UNKNOWN, that is returned; else, if either is TRANSLUCENT, 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is returned; else, if either is TRANSPARENT, that is returned; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * else, OPAQUE is returned. 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This is to help in implementing {@link #getOpacity}. 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op1 One opacity value. 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op2 Another opacity value. 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int The combined opacity value. 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getOpacity 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int resolveOpacity(int op1, int op2) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == op2) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op1; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == PixelFormat.UNKNOWN || op2 == PixelFormat.UNKNOWN) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.UNKNOWN; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == PixelFormat.TRANSLUCENT || op2 == PixelFormat.TRANSLUCENT) { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.TRANSLUCENT; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == PixelFormat.TRANSPARENT || op2 == PixelFormat.TRANSPARENT) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.TRANSPARENT; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.OPAQUE; 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a Region representing the part of the Drawable that is completely 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transparent. This can be used to perform drawing operations, identifying 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which parts of the target will not change when rendering the Drawable. 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default implementation returns null, indicating no transparent 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * region; subclasses can optionally override this to return an actual 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Region if they want to supply this optimization information, but it is 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not required that they do so. 78623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns null if the Drawables has no transparent region to 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * report, else a Region holding the parts of the Drawable's bounds that 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are transparent. 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Region getTransparentRegion() { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 79423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this in your subclass to change appearance if you recognize the 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified state. 79823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the state change has caused the appearance of 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the Drawable to change (that is, it needs to be drawn), else false 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it looks the same and there is no need to redraw it since its 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last state. 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onStateChange(int[] state) { return false; } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Override this in your subclass to change appearance if you vary based 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on level. 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the level change has caused the appearance of 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the Drawable to change (that is, it needs to be drawn), else false 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it looks the same and there is no need to redraw it since its 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last level. 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onLevelChange(int level) { return false; } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 814c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen * Override this in your subclass to change appearance if you vary based on 815c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen * the bounds. 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) {} 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the intrinsic width of the underlying drawable object. Returns 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * -1 if it has no intrinsic width, such as with a solid color. 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the intrinsic height of the underlying drawable object. Returns 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * -1 if it has no intrinsic height, such as with a solid color. 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 83423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the minimum width suggested by this Drawable. If a View uses this 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable as a background, it is suggested that the View use at least this 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value for its width. (There will be some scenarios where this will not be 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible.) This value should INCLUDE any padding. 84023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The minimum width suggested by this Drawable. If this Drawable 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doesn't have a suggested minimum width, 0 is returned. 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumWidth() { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int intrinsicWidth = getIntrinsicWidth(); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intrinsicWidth > 0 ? intrinsicWidth : 0; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the minimum height suggested by this Drawable. If a View uses this 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable as a background, it is suggested that the View use at least this 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value for its height. (There will be some scenarios where this will not be 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible.) This value should INCLUDE any padding. 85423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The minimum height suggested by this Drawable. If this Drawable 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doesn't have a suggested minimum height, 0 is returned. 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumHeight() { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int intrinsicHeight = getIntrinsicHeight(); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intrinsicHeight > 0 ? intrinsicHeight : 0; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 86223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return in padding the insets suggested by this Drawable for placing 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content inside the drawable's bounds. Positive values move toward the 8667dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * center of the Drawable (set Rect.inset). 8677dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * 8687dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * @return true if this drawable actually has a padding, else false. When false is returned, 8697dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * the padding is always set to 0. 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8717dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik public boolean getPadding(@NonNull Rect padding) { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(0, 0, 0, 0); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8771557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * Return in insets the layout insets suggested by this Drawable for use with alignment 878bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne * operations during layout. 8791557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * 8801557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * @hide 8811557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne */ 8827b7578184567f4e4f0740ce935cc192765410ccaPhilip Milne public Insets getOpticalInsets() { 883bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne return Insets.NONE; 8841557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 8851557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne 8861557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne /** 8879a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Called to get the drawable to populate the Outline that defines its drawing area. 888b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * <p> 8899a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * This method is called by the default {@link android.view.ViewOutlineProvider} to define 8909a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * the outline of the View. 8917dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * <p> 89277b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik * The default behavior defines the outline to be the bounding rectangle of 0 alpha. 89377b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik * Subclasses that wish to convey a different shape or alpha value must override this method. 8947dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * 8959a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * @see android.view.View#setOutlineProvider(android.view.ViewOutlineProvider) 896b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik */ 89731ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(@NonNull Outline outline) { 898e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik outline.setRect(getBounds()); 8993f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik outline.setAlpha(0); 900e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik } 901b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 902b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik /** 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Make this drawable mutable. This operation cannot be reversed. A mutable 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawable is guaranteed to not share its state with any other drawable. 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is especially useful when you need to modify properties of drawables 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loaded from resources. By default, all drawables instances loaded from 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same resource share a common state; if you modify the state of one 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instance, all the other instances will receive the same modification. 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calling this method on a mutable Drawable will have no effect. 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return This drawable. 9131e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see ConstantState 9141e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see #getConstantState() 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable mutate() { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 921727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * Clears the mutated state, allowing this drawable to be cached and 922727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * mutated again. 923727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * <p> 924727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * This is hidden because only framework drawables can be cached, so 925727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * custom drawables don't need to support constant state, mutate(), or 926727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * clearMutated(). 927727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * 928727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * @hide 929727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette */ 930727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette public void clearMutated() { 931727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette // Default implementation is no-op. 932727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 933727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 934727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette /** 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a drawable from an inputstream 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromStream(InputStream is, String srcName) { 9380acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable"); 9390acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn try { 9406dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette return createFromResourceStream(null, null, is, srcName); 9410acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } finally { 9420acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 9430acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 94711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * Create a drawable from an inputstream, using the given resources and 94811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * value to determine density information. 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromResourceStream(Resources res, TypedValue value, 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream is, String srcName) { 9520acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable"); 9530acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn try { 954910a0b4d02d0be3e164a32825785fa3d02fe55a2Alan Viverette return createFromResourceStream(res, value, is, srcName, null); 9550acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } finally { 9560acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 9570acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } 9587341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 9597341d7a104b47996445d069a695e155a07184606Dianne Hackborn 9607341d7a104b47996445d069a695e155a07184606Dianne Hackborn /** 9617341d7a104b47996445d069a695e155a07184606Dianne Hackborn * Create a drawable from an inputstream, using the given resources and 9627341d7a104b47996445d069a695e155a07184606Dianne Hackborn * value to determine density information. 9637341d7a104b47996445d069a695e155a07184606Dianne Hackborn */ 9647341d7a104b47996445d069a695e155a07184606Dianne Hackborn public static Drawable createFromResourceStream(Resources res, TypedValue value, 9657341d7a104b47996445d069a695e155a07184606Dianne Hackborn InputStream is, String srcName, BitmapFactory.Options opts) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is == null) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* ugh. The decodeStream contract is that we have already allocated 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project the pad rect, but if the bitmap does not had a ninepatch chunk, 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project then the pad will be ignored. If we could change this to lazily 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alloc/assign the rect, we could avoid the GC churn of making new 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rects only to drop them on the floor. 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect pad = new Rect(); 977e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 97811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // Special stuff for compatibility mode: if the target density is not 97911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // the same as the display density, but the resource -is- the same as 98011ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // the display density, then don't scale it down to the target density. 98111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // This allows us to load the system's density-correct resources into 98211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // an application in compatibility mode, without scaling those down 98311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // to the compatibility density only to have them scaled back up when 98411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // drawn to the screen. 9857341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (opts == null) opts = new BitmapFactory.Options(); 986f1c0aeda259dd0dbab4356c909d33fe7e1ca0d2aDianne Hackborn opts.inScreenDensity = res != null 987f1c0aeda259dd0dbab4356c909d33fe7e1ca0d2aDianne Hackborn ? res.getDisplayMetrics().noncompatDensityDpi : DisplayMetrics.DENSITY_DEVICE; 98811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn Bitmap bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts); 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bm != null) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] np = bm.getNinePatchChunk(); 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (np == null || !NinePatch.isNinePatchChunk(np)) { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project np = null; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pad = null; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 995c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette 996c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette final Rect opticalInsets = new Rect(); 997c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette bm.getOpticalInsets(opticalInsets); 998c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette return drawableFromBitmap(res, bm, np, pad, opticalInsets, srcName); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a drawable from an XML document. For more information on how to 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * create resources in XML, see 1006dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>. 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromXml(Resources r, XmlPullParser parser) 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 10106dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette return createFromXml(r, parser, null); 101152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 101252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 101352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 10146dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * Create a drawable from an XML document using an optional {@link Theme}. 10156dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * For more information on how to create resources in XML, see 101652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>. 101752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 10186dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette public static Drawable createFromXml(Resources r, XmlPullParser parser, Theme theme) 101952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throws XmlPullParserException, IOException { 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = Xml.asAttributeSet(parser); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.START_TAG && 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project type != XmlPullParser.END_DOCUMENT) { 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Empty loop 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != XmlPullParser.START_TAG) { 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("No start tag found"); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10326dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette Drawable drawable = createFromXmlInner(r, parser, attrs, theme); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable == null) { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unknown initial tag: " + parser.getName()); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create from inside an XML document. Called on a parser positioned at 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a tag in an XML document, tries to create a Drawable from that tag. 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns null if the tag is not a valid drawable. 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs) 104752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throws XmlPullParserException, IOException { 10486dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette return createFromXmlInner(r, parser, attrs, null); 104952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1051e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette /** 10526dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * Create a drawable from inside an XML document using an optional 10536dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * {@link Theme}. Called on a parser positioned at a tag in an XML 10546dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * document, tries to create a Drawable from that tag. Returns {@code null} 10556dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * if the tag is not a valid drawable. 1056e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette */ 10576dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs, 10586dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette Theme theme) throws XmlPullParserException, IOException { 105952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final Drawable drawable; 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 106152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final String name = parser.getName(); 1062d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar switch (name) { 1063d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "selector": 1064d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new StateListDrawable(); 1065d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1066d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "animated-selector": 1067d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new AnimatedStateListDrawable(); 1068d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1069d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "level-list": 1070d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new LevelListDrawable(); 1071d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1072d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "layer-list": 1073d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new LayerDrawable(); 1074d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1075d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "transition": 1076d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new TransitionDrawable(); 1077d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1078d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "ripple": 1079d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new RippleDrawable(); 1080d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1081d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "color": 1082d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new ColorDrawable(); 1083d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1084d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "shape": 1085d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new GradientDrawable(); 1086d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1087d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "vector": 1088d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new VectorDrawable(); 1089d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1090d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "animated-vector": 1091d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new AnimatedVectorDrawable(); 1092d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1093d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "scale": 1094d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new ScaleDrawable(); 1095d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1096d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "clip": 1097d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new ClipDrawable(); 1098d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1099d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "rotate": 1100d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new RotateDrawable(); 1101d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1102d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "animated-rotate": 1103d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new AnimatedRotateDrawable(); 1104d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1105d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "animation-list": 1106d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new AnimationDrawable(); 1107d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1108d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "inset": 1109d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new InsetDrawable(); 1110d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1111d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "bitmap": 1112d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new BitmapDrawable(r); 1113d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar if (r != null) { 1114d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar ((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics()); 1115d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar } 1116d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1117d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar case "nine-patch": 1118d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar drawable = new NinePatchDrawable(); 1119d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar if (r != null) { 1120d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar ((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics()); 1121d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar } 1122d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar break; 1123d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar default: 1124d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar throw new XmlPullParserException(parser.getPositionDescription() + 1125d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar ": invalid drawable tag " + name); 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1127d422dc358f0100106dc07d7b903201eb9b043b11Yigit Boyar } 112852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette drawable.inflate(r, parser, attrs, theme); 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a drawable from file path name. 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromPath(String pathName) { 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pathName == null) { 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11410acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, pathName); 11420acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn try { 11430acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Bitmap bm = BitmapFactory.decodeFile(pathName); 11440acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn if (bm != null) { 11450acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn return drawableFromBitmap(null, bm, null, null, null, pathName); 11460acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } 11470acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } finally { 11480acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11541e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 115552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Inflate this Drawable from an XML resource. Does not apply a theme. 115652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 115752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @see #inflate(Resources, XmlPullParser, AttributeSet, Theme) 11581e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 116152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette inflate(r, parser, attrs, null); 116252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 116352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 116452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 116552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Inflate this Drawable from an XML resource optionally styled by a theme. 116652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 116752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param r Resources used to resolve attribute values 116852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param parser XML parser from which to inflate this Drawable 116952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param attrs Base set of attribute values 117052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param theme Theme to apply, may be null 117152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @throws XmlPullParserException 117252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @throws IOException 117352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 117452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme) 117552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throws XmlPullParserException, IOException { 117652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette final TypedArray a; 117752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (theme != null) { 117852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette a = theme.obtainStyledAttributes( 117952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette attrs, com.android.internal.R.styleable.Drawable, 0, 0); 118052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } else { 118152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette a = r.obtainAttributes(attrs, com.android.internal.R.styleable.Drawable); 118252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflateWithAttributes(r, parser, a, com.android.internal.R.styleable.Drawable_visible); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11881e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 11891e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Inflate a Drawable from an XML resource. 11901e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * 11911e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @throws XmlPullParserException 11921e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @throws IOException 11931e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 119452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette void inflateWithAttributes(Resources r, XmlPullParser parser, TypedArray attrs, int visibleAttr) 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisible = attrs.getBoolean(visibleAttr, mVisible); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11991e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 12001e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * This abstract class is used by {@link Drawable}s to store shared constant state and data 12011e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * between Drawables. {@link BitmapDrawable}s created from the same resource will for instance 12021e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * share a unique bitmap stored in their ConstantState. 12031e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * 12041e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * <p> 12051e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * {@link #newDrawable(Resources)} can be used as a factory to create new Drawable instances 12061e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * from this ConstantState. 12071e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * </p> 12081e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * 12091e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Use {@link Drawable#getConstantState()} to retrieve the ConstantState of a Drawable. Calling 12101e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * {@link Drawable#mutate()} on a Drawable should typically create a new ConstantState for that 12111e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Drawable. 12121e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class ConstantState { 1214c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn /** 1215c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * Create a new drawable without supplying resources the caller 1216c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * is running in. Note that using this means the density-dependent 1217c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * drawables (like bitmaps) will not be able to update their target 121820fc9bfe3ad16c5f36026fc43c85d0647b75cc40Gilles Debunne * density correctly. One should use {@link #newDrawable(Resources)} 121920fc9bfe3ad16c5f36026fc43c85d0647b75cc40Gilles Debunne * instead to provide a resource. 1220c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn */ 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Drawable newDrawable(); 122252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 1223c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn /** 1224c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * Create a new Drawable instance from its constant state. This 1225c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * must be implemented for drawables that change based on the target 1226c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * density of their caller (that is depending on whether it is 1227c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * in compatibility mode). 1228c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn */ 1229c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn public Drawable newDrawable(Resources res) { 1230c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn return newDrawable(); 1231c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn } 123252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 123352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 123452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Create a new Drawable instance from its constant state. This must be 123552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * implemented for drawables that can have a theme applied. 123652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 123752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public Drawable newDrawable(Resources res, Theme theme) { 123817cd4dfe3a05c2eddbcbc76066ff3b13fc3f2c8bAlan Viverette return newDrawable(null); 123952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 124052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 1241c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn /** 1242c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * Return a bit mask of configuration changes that will impact 1243c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * this drawable (and thus require completely reloading it). 1244c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn */ 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getChangingConfigurations(); 12463b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 12473b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy /** 1248dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck * @return Total pixel count 12493b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * @hide 12503b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */ 1251dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck public int addAtlasableBitmaps(Collection<Bitmap> atlasList) { 1252dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck return 0; 1253dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1254dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck 1255dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck /** @hide */ 1256dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck protected final boolean isAtlasable(Bitmap bitmap) { 1257dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck return bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888; 12583b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 125952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 126052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 126152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Return whether this constant state can have a theme applied. 126252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 126352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 126452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 126552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12681e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 12691e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Return a {@link ConstantState} instance that holds the shared state of this Drawable. 1270d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * 12711e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @return The ConstantState associated to that Drawable. 12721e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see ConstantState 12731e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see Drawable#mutate() 12741e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ConstantState getConstantState() { 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Drawable drawableFromBitmap(Resources res, Bitmap bm, byte[] np, 1280ec4a50428d5f26a22df3edaf7e5b08f41d5cb54bAmith Yamasani Rect pad, Rect layoutBounds, String srcName) { 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (np != null) { 12831557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne return new NinePatchDrawable(res, bm, np, pad, layoutBounds, srcName); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 128611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn return new BitmapDrawable(res, bm); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1288d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette 1289d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette /** 1290b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette * Ensures the tint filter is consistent with the current tint color and 1291b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette * mode. 1292b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette */ 1293b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette PorterDuffColorFilter updateTintFilter(PorterDuffColorFilter tintFilter, ColorStateList tint, 1294b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette PorterDuff.Mode tintMode) { 1295b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (tint == null || tintMode == null) { 1296b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette return null; 1297b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 1298b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 1299b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette final int color = tint.getColorForState(getState(), Color.TRANSPARENT); 1300b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (tintFilter == null) { 1301b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette return new PorterDuffColorFilter(color, tintMode); 1302b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 1303b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 1304b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette tintFilter.setColor(color); 1305b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette tintFilter.setMode(tintMode); 1306b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette return tintFilter; 1307b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 1308b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 1309b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette /** 131052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Obtains styled attributes from the theme, if available, or unstyled 131152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * resources if the theme is null. 131252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 131352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette static TypedArray obtainAttributes( 131452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette Resources res, Theme theme, AttributeSet set, int[] attrs) { 131552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (theme == null) { 131652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return res.obtainAttributes(set, attrs); 131752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 131852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return theme.obtainStyledAttributes(set, attrs, 0, 0); 131952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 132052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 132152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 132212b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode 1323d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * attribute's enum value. 1324911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette * 1325911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette * @hide 1326d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette */ 1327911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette public static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) { 132812b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette switch (value) { 13292f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 3: return Mode.SRC_OVER; 13302f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 5: return Mode.SRC_IN; 13312f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 9: return Mode.SRC_ATOP; 13322f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 14: return Mode.MULTIPLY; 13332f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 15: return Mode.SCREEN; 13342f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 16: return Mode.ADD; 13352f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette default: return defaultMode; 1336d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette } 1337d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette } 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1340