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 19b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport com.android.internal.R; 20b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette 21b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport org.xmlpull.v1.XmlPullParser; 22b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport org.xmlpull.v1.XmlPullParserException; 23b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette 24b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport android.annotation.AttrRes; 2580756e38882720860db52f1fcc21fa1505a02abfTor Norbyeimport android.annotation.ColorInt; 26b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viveretteimport android.annotation.IntRange; 277dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craikimport android.annotation.NonNull; 28bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craikimport android.annotation.Nullable; 29ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viveretteimport android.content.pm.ActivityInfo.Config; 30e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viveretteimport android.content.res.ColorStateList; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 3252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viveretteimport android.content.res.Resources.Theme; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 3478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Bitmap; 3578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.BitmapFactory; 3678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Canvas; 37b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Color; 3878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.ColorFilter; 39b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Insets; 4078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.NinePatch; 41b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craikimport android.graphics.Outline; 4278aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PixelFormat; 4378aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuff; 44b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.PorterDuff.Mode; 4578aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.PorterDuffColorFilter; 4678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Rect; 4778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.graphics.Region; 48b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.graphics.Xfermode; 49b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viveretteimport android.os.Trace; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 5111ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackbornimport android.util.DisplayMetrics; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.StateSet; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 5478aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport android.util.Xml; 55d9273d6f289d9b55da3fd0db2f659fdfb48106a8Tor Norbyeimport android.view.View; 5678aaa97b77d56e35e994611406deb398eb9005dbGilles Debunne 5778aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.IOException; 5878aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.io.InputStream; 59f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guyimport java.lang.ref.WeakReference; 6078aaa97b77d56e35e994611406deb398eb9005dbGilles Debunneimport java.util.Arrays; 61dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reckimport java.util.Collection; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable is a general abstraction for "something that can be drawn." Most 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * often you will deal with Drawable as the type of resource retrieved for 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing things to the screen; the Drawable class provides a generic API for 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dealing with an underlying visual resource that may take a variety of forms. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike a {@link android.view.View}, a Drawable does not have any facility to 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receive events or otherwise interact with the user. 7023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>In addition to simple drawing, Drawable provides a number of generic 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mechanisms for its client to interact with what is being drawn: 7323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #setBounds} method <var>must</var> be called to tell the 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable where it is drawn and how large it should be. All Drawables 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should respect the requested size, often simply by scaling their 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * imagery. A client can find the preferred size for some Drawables with 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #getIntrinsicHeight} and {@link #getIntrinsicWidth} methods. 8023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #getPadding} method can return from some Drawables 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * information about how to frame content that is placed inside of them. 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example, a Drawable that is intended to be the frame for a button 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * widget would need to return padding that correctly places the label 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inside of itself. 8623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #setState} method allows the client to tell the Drawable 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in which state it is to be drawn, such as "focused", "selected", etc. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Some drawables may modify their imagery based on the selected state. 9023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The {@link #setLevel} method allows the client to supply a single 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * continuous controller that can modify the Drawable is displayed, such as 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a battery level or progress level. Some drawables may modify their 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * imagery based on the current level. 9523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> A Drawable can perform animations by calling back to its client 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * through the {@link Callback} interface. All clients should support this 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface (via {@link #setCallback}) so that animations will work. A 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simple way to do this is through the system facilities such as 100d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * {@link android.view.View#setBackground(Drawable)} and 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ImageView}. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 10323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Though usually not visible to the application, Drawables may take a variety 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of forms: 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Bitmap</b>: the simplest Drawable, a PNG or JPEG image. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Nine Patch</b>: an extension to the PNG format allows it to 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specify information about how to stretch it and place things inside of 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Shape</b>: contains simple drawing commands instead of a raw 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bitmap, allowing it to resize better in some cases. 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Layers</b>: a compound drawable, which draws multiple underlying 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables on top of each other. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>States</b>: a compound drawable that selects one of a set of 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables based on its state. 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Levels</b>: a compound drawable that selects one of a set of 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables based on its level. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> <b>Scale</b>: a compound drawable with a single child drawable, 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whose overall size is modified based on the current level. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 12361fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * 124112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <a name="Custom"></a> 125112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <h3>Custom drawables</h3> 126112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * 127112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p> 128112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * All versions of Android allow the Drawable class to be extended and used at 129112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * run time in place of framework-provided drawable classes. Starting in 130112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * {@link android.os.Build.VERSION_CODES#N API 24}, custom drawables classes 131112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * may also be used in XML. 132112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p> 133112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <strong>Note:</strong> Custom drawable classes are only accessible from 134112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * within your application package. Other applications will not be able to load 135112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * them. 136112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p> 137112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * At a minimum, custom drawable classes must implement the abstract methods on 138112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * Drawable and should override the {@link Drawable#draw(Canvas)} method to 139112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * draw content. 140112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <p> 141112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * Custom drawables classes may be used in XML in multiple ways: 142112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <ul> 143112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <li> 144112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * Using the fully-qualified class name as the XML element name. For 145112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * this method, the custom drawable class must be a public top-level 146112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * class. 147112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <pre> 148112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <com.myapp.MyCustomDrawable xmlns:android="http://schemas.android.com/apk/res/android" 149112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * android:color="#ffff0000" /> 150112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </pre> 151112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </li> 152112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <li> 153112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * Using <em>drawable</em> as the XML element name and specifying the 154112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * fully-qualified class name from the <em>class</em> attribute. This 155112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * method may be used for both public top-level classes and public 156112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * static inner classes. 157112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <pre> 158112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * <drawable xmlns:android="http://schemas.android.com/apk/res/android" 159112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * class="com.myapp.MyTopLevelClass$InnerCustomDrawable" 160112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * android:color="#ffff0000" /> 161112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </pre> 162112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </li> 163112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * </ul> 164112f0aa28e017d4d7a3638389709b94a718dadc8Alan Viverette * 16561fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <div class="special reference"> 16661fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <h3>Developer Guides</h3> 16761fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <p>For more information about how to use drawables, read the 16861fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html">Canvas and Drawables</a> developer 16961fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * guide. For information and examples of creating drawable resources (XML or bitmap files that 17061fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * can be loaded in code), read the 17161fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a> 17261fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * document.</p></div> 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class Drawable { 17523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy private static final Rect ZERO_BOUNDS_RECT = new Rect(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 177607bd848269fb802550e63aa61945790616f97a7Alan Viverette static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN; 178607bd848269fb802550e63aa61945790616f97a7Alan Viverette 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mStateSet = StateSet.WILD_CARD; 1800b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette private int mLevel = 0; 181ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette private @Config int mChangingConfigurations = 0; 1820f07b2c850ee1462ca4cf3137a954a9fc4bdf773Brad Fitzpatrick private Rect mBounds = ZERO_BOUNDS_RECT; // lazily becomes a new Rect() 183f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy private WeakReference<Callback> mCallback = null; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mVisible = true; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 186b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio private int mLayoutDirection; 187b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw in its bounds (set via setBounds) respecting optional effects such 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as alpha (set via setAlpha) and color filter (set via setColorFilter). 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param canvas The canvas to draw into 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 194b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public abstract void draw(@NonNull Canvas canvas); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify a bounding rectangle for the Drawable. This is where the drawable 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will draw when its draw() method is called. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBounds(int left, int top, int right, int bottom) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect oldBounds = mBounds; 20223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 20323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy if (oldBounds == ZERO_BOUNDS_RECT) { 20423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy oldBounds = mBounds = new Rect(); 20523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy } 20623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldBounds.left != left || oldBounds.top != top || 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oldBounds.right != right || oldBounds.bottom != bottom) { 20916f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette if (!oldBounds.isEmpty()) { 21016f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette // first invalidate the previous bounds 21116f1d81d47beb1e04504a76de66e2919dde08c33Alan Viverette invalidateSelf(); 212633326e29f008d2b86e523cfeedcbb2a0883181fChet Haase } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBounds.set(left, top, right, bottom); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onBoundsChange(mBounds); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify a bounding rectangle for the Drawable. This is where the drawable 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will draw when its draw() method is called. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 222b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public void setBounds(@NonNull Rect bounds) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBounds(bounds.left, bounds.top, bounds.right, bounds.bottom); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a copy of the drawable's bounds in the specified Rect (allocated 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the caller). The bounds specify where this will draw when its draw() 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method is called. 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bounds Rect to receive the drawable's bounds (allocated by the 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * caller). 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 234b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public final void copyBounds(@NonNull Rect bounds) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bounds.set(mBounds); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a copy of the drawable's bounds in a new Rect. This returns the 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * same values as getBounds(), but the returned object is guaranteed to not 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be changed later by the drawable (i.e. it retains no reference to this 24223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * rect). If the caller already has a Rect allocated, call copyBounds(rect). 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A copy of the drawable's bounds 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 246b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @NonNull 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Rect copyBounds() { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Rect(mBounds); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the drawable's bounds Rect. Note: for efficiency, the returned 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object may be the same object stored in the drawable (though this is not 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * guaranteed), so if a persistent copy of the bounds is needed, call 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * copyBounds(rect) instead. 25623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * You should also not change the object returned by this method as it may 25723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * be the same object stored in the drawable. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The bounds of the drawable (which may change later, so caller 26023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * beware). DO NOT ALTER the returned object as it may change the 26123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * stored bounds of this drawable. 26223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 26323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * @see #copyBounds() 264e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #copyBounds(android.graphics.Rect) 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 266b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @NonNull 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Rect getBounds() { 26823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy if (mBounds == ZERO_BOUNDS_RECT) { 26923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy mBounds = new Rect(); 27023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy } 27123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBounds; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 276d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * Return the drawable's dirty bounds Rect. Note: for efficiency, the 277d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * returned object may be the same object stored in the drawable (though 278d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * this is not guaranteed). 279d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * <p> 280d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * By default, this returns the full drawable bounds. Custom drawables may 281d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * override this method to perform more precise invalidation. 282d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * 283e7772d313b88e9fd3366670a9c8d1b145edef344Alan Viverette * @return The dirty bounds of this drawable 284d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette */ 285b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @NonNull 286d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette public Rect getDirtyBounds() { 287d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette return getBounds(); 288d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette } 289d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette 290d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette /** 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set a mask of the configuration parameters for which this drawable 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may change, requiring that it be re-created. 29323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param configs A mask of the changing configuration parameters, as 2958e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * defined by {@link android.content.pm.ActivityInfo}. 29623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 2978e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * @see android.content.pm.ActivityInfo 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 299ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public void setChangingConfigurations(@Config int configs) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChangingConfigurations = configs; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a mask of the configuration parameters for which this drawable 30569ea4e15e52c456537575d21443ac1efdb03a902Brad Fitzpatrick * may change, requiring that it be re-created. The default implementation 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns whatever was provided through 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setChangingConfigurations(int)} or 0 by default. Subclasses 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may extend this to or in the changing configurations of any other 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawables they hold. 31023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns a mask of the changing configuration parameters, as 3128e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * defined by {@link android.content.pm.ActivityInfo}. 31323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3148e5e11b99fac942122ee2d6cdd30af51564861aeAlan Viverette * @see android.content.pm.ActivityInfo 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 316ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public @Config int getChangingConfigurations() { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChangingConfigurations; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32181e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette * Set to true to have the drawable dither its colors when drawn to a 32281e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette * device with fewer than 8-bits per color component. 323c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * 324c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * @see android.graphics.Paint#setDither(boolean); 32581e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette * @deprecated This property is ignored. 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32781e7dbddf10ecae99f65641d8774ca6b1aceac30Alan Viverette @Deprecated 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) {} 32923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 331c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * Set to true to have the drawable filter its bitmaps with bilinear 332c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * sampling when they are scaled or rotated. 333c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * 334c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * <p>This can improve appearance when bitmaps are rotated. If the drawable 335c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * does not use bitmaps, this call is ignored.</p> 336c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * 337c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * @see #isFilterBitmap() 338c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * @see android.graphics.Paint#setFilterBitmap(boolean); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFilterBitmap(boolean filter) {} 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 343c79df8e831e50abae9f781148e0aee63f6c29659Chris Craik * @return whether this drawable filters its bitmaps 344f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette * @see #setFilterBitmap(boolean) 345f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette */ 346dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette public boolean isFilterBitmap() { 347f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette return false; 348f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette } 349f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette 350f4c068b72e2dee2e6944488ef00b64c93217d7e8Alan Viverette /** 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implement this interface if you want to create an animated drawable that 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extends {@link android.graphics.drawable.Drawable Drawable}. 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Upon retrieving a drawable, use 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setCallback(android.graphics.drawable.Drawable.Callback)} 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to supply your implementation of the interface to the drawable; it uses 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this interface to schedule and execute animation changes. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 358f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette public interface Callback { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when the drawable needs to be redrawn. A view at this point 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * should invalidate itself (or at least the part of itself where the 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawable appears). 36323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param who The drawable that is requesting the update. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 366f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette void invalidateDrawable(@NonNull Drawable who); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable can call this to schedule the next frame of its 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation. An implementation can generally simply call 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.Handler#postAtTime(Runnable, Object, long)} with 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parameters <var>(what, who, when)</var> to perform the 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scheduling. 37423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param who The drawable being scheduled. 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The action to execute. 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param when The time (in milliseconds) to run. The timebase is 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#uptimeMillis} 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 380f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette void scheduleDrawable(@NonNull Drawable who, @NonNull Runnable what, long when); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable can call this to unschedule an action previously 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scheduled with {@link #scheduleDrawable}. An implementation can 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * generally simply call 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.Handler#removeCallbacks(Runnable, Object)} with 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parameters <var>(what, who)</var> to unschedule the drawable. 38823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param who The drawable being unscheduled. 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The action being unscheduled. 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 392f6d87ec193f17e8dad82c9994ba7a58e975d364bAlan Viverette void unscheduleDrawable(@NonNull Drawable who, @NonNull Runnable what); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bind a {@link Callback} object to this Drawable. Required for clients 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that want to support animated drawables. 39823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cb The client's Callback implementation. 400e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 401e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #getCallback() 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 403b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public final void setCallback(@Nullable Callback cb) { 404b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette mCallback = cb != null ? new WeakReference<>(cb) : null; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 408f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy * Return the current {@link Callback} implementation attached to this 409f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy * Drawable. 410e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 411f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy * @return A {@link Callback} instance or null if no callback was set. 412e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * 413e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #setCallback(android.graphics.drawable.Drawable.Callback) 414f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy */ 415b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @Nullable 416f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy public Callback getCallback() { 417b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette return mCallback != null ? mCallback.get() : null; 418f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy } 419e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 420f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy /** 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use the current {@link Callback} implementation to have this Drawable 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * redrawn. Does nothing if there is no Callback attached to the 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable. 42423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Callback#invalidateDrawable 426e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #getCallback() 427e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui * @see #setCallback(android.graphics.drawable.Drawable.Callback) 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 429f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy public void invalidateSelf() { 430f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy final Callback callback = getCallback(); 431f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (callback != null) { 432f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy callback.invalidateDrawable(this); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use the current {@link Callback} implementation to have this Drawable 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scheduled. Does nothing if there is no Callback attached to the 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable. 44023bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The action being scheduled. 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param when The time (in milliseconds) to run. 44323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Callback#scheduleDrawable 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 446b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public void scheduleSelf(@NonNull Runnable what, long when) { 447f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy final Callback callback = getCallback(); 448f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (callback != null) { 449f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy callback.scheduleDrawable(this, what, when); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use the current {@link Callback} implementation to have this Drawable 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unscheduled. Does nothing if there is no Callback attached to the 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable. 45723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what The runnable that you no longer want called. 45923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Callback#unscheduleDrawable 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 462b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public void unscheduleSelf(@NonNull Runnable what) { 463f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy final Callback callback = getCallback(); 464f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy if (callback != null) { 465f2a47782f31b58d2d31bd00b50fe43604af8b9c2Romain Guy callback.unscheduleDrawable(this, what); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 470b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * Returns the resolved layout direction for this Drawable. 471b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * 472c5daf84f6647d3280c59554cd6ec9c2a4f119bfcFabrice Di Meglio * @return One of {@link android.view.View#LAYOUT_DIRECTION_LTR}, 473a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * {@link android.view.View#LAYOUT_DIRECTION_RTL} 474a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @see #setLayoutDirection(int) 475c1da65187a4b9de8f72bd617ef937030187c0a92Fabrice Di Meglio */ 476b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @View.ResolvedLayoutDir int getLayoutDirection() { 477b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio return mLayoutDirection; 478b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio } 479b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio 480b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio /** 481a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Set the layout direction for this drawable. Should be a resolved 482a6c51149c59b2921507f6903e490bd00702972d1Doris Liu * layout direction, as the Drawable has no capacity to do the resolution on 483a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * its own. 484b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio * 485a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param layoutDirection the resolved layout direction for the drawable, 486a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * either {@link android.view.View#LAYOUT_DIRECTION_LTR} 487a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * or {@link android.view.View#LAYOUT_DIRECTION_RTL} 48878e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette * @return {@code true} if the layout direction change has caused the 48978e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette * appearance of the drawable to change such that it needs to be 49078e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette * re-drawn, {@code false} otherwise 491a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @see #getLayoutDirection() 492b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio */ 493a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette public final boolean setLayoutDirection(@View.ResolvedLayoutDir int layoutDirection) { 494a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette if (mLayoutDirection != layoutDirection) { 495b03b434089cf2106c467b2827a65e5c589c91d01Fabrice Di Meglio mLayoutDirection = layoutDirection; 496dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette return onLayoutDirectionChanged(layoutDirection); 4976a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio } 498a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return false; 499a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette } 500a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette 501a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 502a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Called when the drawable's resolved layout direction changes. 503a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 504a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param layoutDirection the new resolved layout direction 50578e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette * @return {@code true} if the layout direction change has caused the 50678e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette * appearance of the drawable to change such that it needs to be 50778e561ce541e5c72780c68b5b14eb50c08bb97acAlan Viverette * re-drawn, {@code false} otherwise 508a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @see #setLayoutDirection(int) 509a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 510dfa4646eca54511a28f2c61e1f4b9c697e05a913Alan Viverette public boolean onLayoutDirectionChanged(@View.ResolvedLayoutDir int layoutDirection) { 511a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette return false; 5126a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio } 5136a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio 5146a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio /** 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify an alpha value for the drawable. 0 means fully transparent, and 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 255 means fully opaque. 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 518b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public abstract void setAlpha(@IntRange(from=0,to=255) int alpha); 51923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 521b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * Gets the current alpha value for the drawable. 0 means fully transparent, 522b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * 255 means fully opaque. This method is implemented by 523b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * Drawable subclasses and the value returned is specific to how that class treats alpha. 524b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * The default return value is 255 if the class does not override this method to return a value 525b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase * specific to its use of alpha. 526b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase */ 527b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @IntRange(from=0,to=255) 528b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase public int getAlpha() { 529b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase return 0xFF; 530b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase } 531b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase 532b1af7f3d4be6cd6bc6e1e805f22c209e19bf928fChet Haase /** 533bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @hide 534bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * 535bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Internal-only method for setting xfermode on certain supported drawables. 536bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * 537bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Should not be made public since the layers and drawing area with which 538bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Drawables draw is private implementation detail, and not something apps 539bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * should rely upon. 54031049d76c55b18a6d9993f0d9687598740b16014Adam Powell */ 541b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public void setXfermode(@Nullable Xfermode mode) { 54231049d76c55b18a6d9993f0d9687598740b16014Adam Powell // Base implementation drops it on the floor for compatibility. Whee! 54331049d76c55b18a6d9993f0d9687598740b16014Adam Powell } 54431049d76c55b18a6d9993f0d9687598740b16014Adam Powell 54531049d76c55b18a6d9993f0d9687598740b16014Adam Powell /** 546bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Specify an optional color filter for the drawable. 547bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p> 548bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * If a Drawable has a ColorFilter, each output pixel of the Drawable's 549bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * drawing contents will be modified by the color filter before it is 550bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * blended onto the render target of a Canvas. 551bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 552bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p> 553bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Pass {@code null} to remove any existing color filter. 554bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 555bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p class="note"><strong>Note:</strong> Setting a non-{@code null} color 556bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * filter disables {@link #setTintList(ColorStateList) tint}. 557bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 558813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * 559bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @param colorFilter The color filter to apply, or {@code null} to remove the 560813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * existing color filter 561813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette */ 562bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public abstract void setColorFilter(@Nullable ColorFilter colorFilter); 563813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette 564813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette /** 565d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * Specify a color and Porter-Duff mode to be the color filter for this 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawable. 567bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p> 568bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Convenience for {@link #setColorFilter(ColorFilter)} which constructs a 569bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link PorterDuffColorFilter}. 570bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 571bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p class="note"><strong>Note:</strong> Setting a color filter disables 572bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setTintList(ColorStateList) tint}. 573bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 574bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik */ 575417ee5ba89f7e0fe5efd34fce74bf1ee5923d976Tor Norbye public void setColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setColorFilter(new PorterDuffColorFilter(color, mode)); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 579d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette /** 580bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Specifies tint color for this drawable. 581bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p> 582bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * A Drawable's drawing content will be blended together with its tint 583bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * before it is drawn to the screen. This functions similarly to 584bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(int, PorterDuff.Mode)}. 585bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 586a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * <p> 587bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * To clear the tint, pass {@code null} to 588bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setTintList(ColorStateList)}. 589bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 590bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p class="note"><strong>Note:</strong> Setting a color filter via 591bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(ColorFilter)} or 592bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(int, PorterDuff.Mode)} overrides tint. 593bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 594a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * 595bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @param tintColor Color to use for tinting this drawable 596bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @see #setTintList(ColorStateList) 597a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see #setTintMode(PorterDuff.Mode) 598a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette */ 59980756e38882720860db52f1fcc21fa1505a02abfTor Norbye public void setTint(@ColorInt int tintColor) { 600bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik setTintList(ColorStateList.valueOf(tintColor)); 601a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette } 602a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 603a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette /** 604bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Specifies tint color for this drawable as a color state list. 605a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * <p> 606bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * A Drawable's drawing content will be blended together with its tint 607bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * before it is drawn to the screen. This functions similarly to 608bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(int, PorterDuff.Mode)}. 609bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 610bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p class="note"><strong>Note:</strong> Setting a color filter via 611bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(ColorFilter)} or 612bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(int, PorterDuff.Mode)} overrides tint. 613bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 614a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * 615bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @param tint Color state list to use for tinting this drawable, or 616bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@code null} to clear the tint 617bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @see #setTint(int) 618a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @see #setTintMode(PorterDuff.Mode) 619a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette */ 620bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setTintList(@Nullable ColorStateList tint) {} 621a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 622a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette /** 623a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * Specifies a tint blending mode for this drawable. 624a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * <p> 625bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * Defines how this drawable's tint color should be blended into the drawable 62678bf1d329a4c0210394f846be1fd1390314aefc0Alan Viverette * before it is drawn to screen. Default tint mode is {@link PorterDuff.Mode#SRC_IN}. 627bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 628bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * <p class="note"><strong>Note:</strong> Setting a color filter via 629bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(ColorFilter)} or 630bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * {@link #setColorFilter(int, PorterDuff.Mode)} overrides tint. 631bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * </p> 632a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * 633a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette * @param tintMode A Porter-Duff blending mode 634bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @see #setTint(int) 635bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik * @see #setTintList(ColorStateList) 636a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette */ 637bd3bfc5285dcacff0a69fecf3baeeeb90d887a58Chris Craik public void setTintMode(@NonNull PorterDuff.Mode tintMode) {} 638a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette 639a426445dfdab43886dd894f2ba8a1d55bfcbb278Alan Viverette /** 640813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * Returns the current color filter, or {@code null} if none set. 641813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * 642813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette * @return the current color filter, or {@code null} if none set 643813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette */ 644b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @Nullable ColorFilter getColorFilter() { 645813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette return null; 646813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette } 647813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette 648813d85b82cb7cbaa5dbe05496d1038caa17a1698Alan Viverette /** 649d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * Removes the color filter for this drawable. 650d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette */ 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearColorFilter() { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setColorFilter(null); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 656c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * Specifies the hotspot's location within the drawable. 657223622a50db319d634616311ff74267cf49679e7Alan Viverette * 658860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette * @param x The X coordinate of the center of the hotspot 659860126b78aa4d6e8db5208c7f96764a8556cf95fAlan Viverette * @param y The Y coordinate of the center of the hotspot 660223622a50db319d634616311ff74267cf49679e7Alan Viverette */ 661c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette public void setHotspot(float x, float y) {} 662223622a50db319d634616311ff74267cf49679e7Alan Viverette 663223622a50db319d634616311ff74267cf49679e7Alan Viverette /** 664c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * Sets the bounds to which the hotspot is constrained, if they should be 665c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * different from the drawable bounds. 66653a3ed7c46c12c2e578d1b1df8b039c6db690eaaAlan Viverette * 667a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param left position in pixels of the left bound 668a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param top position in pixels of the top bound 669a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param right position in pixels of the right bound 670a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param bottom position in pixels of the bottom bound 671a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @see #getHotspotBounds(android.graphics.Rect) 67261956606818918194a38e045a8e35e7108480e5eAlan Viverette */ 67361956606818918194a38e045a8e35e7108480e5eAlan Viverette public void setHotspotBounds(int left, int top, int right, int bottom) {} 674223622a50db319d634616311ff74267cf49679e7Alan Viverette 675a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette /** 676a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * Populates {@code outRect} with the hotspot bounds. 677a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * 678a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @param outRect the rect to populate with the hotspot bounds 679a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette * @see #setHotspotBounds(int, int, int, int) 680a12962207155305da44b5a1b8fb9acaed358c14cAlan Viverette */ 681b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public void getHotspotBounds(@NonNull Rect outRect) { 6827068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette outRect.set(getBounds()); 6837068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette } 6847068c39526459c18a020e29c1ebfa6aed54e2d0fAlan Viverette 685223622a50db319d634616311ff74267cf49679e7Alan Viverette /** 686d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * Whether this drawable requests projection. 687d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette * 688c80ad99a33ee49d0bac994c1749ff24d243c3862Alan Viverette * @hide magic! 689d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette */ 690d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette public boolean isProjected() { 691d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette return false; 692d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette } 693d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette 694d5154ec2bc7e7c0bdfd14fc784912d390afe43ccAlan Viverette /** 6953b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * Indicates whether this drawable will change its appearance based on 6963b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * state. Clients can use this to determine whether it is necessary to 6973b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * calculate their state and call setState. 69823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 6993b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * @return True if this drawable changes its appearance based on state, 7003b5c4272db3e089c4a06d2db2ddf2aee5ebb6281Alan Viverette * false otherwise. 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setState(int[]) 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isStateful() { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 70623bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify a set of states for the drawable. These are use-case specific, 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * so see the relevant documentation. As an example, the background for 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * widgets like Button understand the following states: 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * [{@link android.R.attr#state_focused}, 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_pressed}]. 71323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the new state you are supplying causes the appearance of the 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable to change, then it is responsible for calling 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em> 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * true will be returned from this function. 71823bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Note: The Drawable holds a reference on to <var>stateSet</var> 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * until a new state array is given to it, so you must not modify this 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * array during that time.</p> 72223bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param stateSet The new set of states to be displayed. 72423bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if this change in state has caused the appearance 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the Drawable to change (hence requiring an invalidate), otherwise 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns false. 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public boolean setState(@NonNull final int[] stateSet) { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Arrays.equals(mStateSet, stateSet)) { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStateSet = stateSet; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return onStateChange(stateSet); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Describes the current state, as a union of primitve states, such as 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_focused}, 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.attr#state_selected}, etc. 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Some drawables may modify their imagery based on the selected state. 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return An array of resource Ids describing the current state. 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 744b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @NonNull int[] getState() { 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStateSet; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 74723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * If this Drawable does transition animations between states, ask that 750079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn * it immediately jump to the current state and skip any active animations. 751079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn */ 752079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn public void jumpToCurrentState() { 753079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn } 754079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn 755079e23575024e103358c982152afb7a720ae1a8aDianne Hackborn /** 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current drawable that will be used by this drawable. For simple drawables, this 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is just the drawable itself. For drawables that change state like 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link StateListDrawable} and {@link LevelListDrawable} this will be the child drawable 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently in use. 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 761b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @NonNull Drawable getCurrent() { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7660b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * Specify the level for the drawable. This allows a drawable to vary its 7670b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * imagery based on a continuous controller, for example to show progress 7680b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * or volume level. 76923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 7700b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * <p>If the new level you are supplying causes the appearance of the 7710b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * Drawable to change, then it is responsible for calling 7720b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * {@link #invalidateSelf} in order to have itself redrawn, <em>and</em> 7730b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * true will be returned from this function. 7740b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * 7750b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * @param level The new level, from 0 (minimum) to 10000 (maximum). 7763da32b768899e7dabe3a16333edf5eca2b9ebe93Alan Viverette * 7770b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * @return Returns true if this change in level has caused the appearance 7780b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * of the Drawable to change (hence requiring an invalidate), otherwise 7790b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * returns false. 7803da32b768899e7dabe3a16333edf5eca2b9ebe93Alan Viverette */ 781b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public final boolean setLevel(@IntRange(from=0,to=10000) int level) { 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLevel != level) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLevel = level; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return onLevelChange(level); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7900b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * Retrieve the current level. 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7920b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * @return int Current level, from 0 (minimum) to 10000 (maximum). 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 794b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public final @IntRange(from=0,to=10000) int getLevel() { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLevel; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set whether this Drawable is visible. This generally does not impact 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the Drawable's behavior, but is a hint that can be used by some 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawables, for example, to decide whether run animations. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visible Set to true if visible, false if not. 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param restart You can supply true here to force the drawable to behave 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as if it has just become visible, even if it had last 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been set visible. Used for example to force animations 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to restart. 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return boolean Returns true if the new visibility is different than 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its previous state. 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setVisible(boolean visible, boolean restart) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean changed = mVisible != visible; 8149891e1fce5f29d0421d34aa481037417bd70853dChet Haase if (changed) { 8159891e1fce5f29d0421d34aa481037417bd70853dChet Haase mVisible = visible; 8169891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 8179891e1fce5f29d0421d34aa481037417bd70853dChet Haase } 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return changed; 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean isVisible() { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mVisible; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8263f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * Set whether this Drawable is automatically mirrored when its layout direction is RTL 8273f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * (right-to left). See {@link android.util.LayoutDirection}. 8283f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * 8293f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * @param mirrored Set to true if the Drawable should be mirrored, false if not. 8303f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio */ 8313f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public void setAutoMirrored(boolean mirrored) { 8323f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 8333f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 8343f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio /** 8353f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * Tells if this Drawable will be automatically mirrored when its layout direction is RTL 8363f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * right-to-left. See {@link android.util.LayoutDirection}. 8373f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * 8383f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio * @return boolean Returns true if this Drawable will be automatically mirrored. 8393f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio */ 8403f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio public boolean isAutoMirrored() { 8413f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio return false; 8423f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio } 8433f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio 8443f5a90b2fbba2a83a8a2c5babd5d466a5e0ad2aaFabrice Di Meglio /** 84552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Applies the specified theme to this Drawable and its children. 8467e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * 8477e3ede288926bdfb79b1571fed74cad614935821Alan Viverette * @param t the theme to apply 84852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 8497e3ede288926bdfb79b1571fed74cad614935821Alan Viverette public void applyTheme(@NonNull @SuppressWarnings("unused") Theme t) { 85052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 85152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 85252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 85352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 85452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 85552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 85652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the opacity/transparency of this Drawable. The returned value is 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * one of the abstract format constants in 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat}: 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#UNKNOWN}, 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#TRANSLUCENT}, 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#TRANSPARENT}, or 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.PixelFormat#OPAQUE}. 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 86596a443b58d9c9849c846750657f959e3743bc5edChet Haase * <p>An OPAQUE drawable is one that draws all all content within its bounds, completely 86696a443b58d9c9849c846750657f959e3743bc5edChet Haase * covering anything behind the drawable. A TRANSPARENT drawable is one that draws nothing 86796a443b58d9c9849c846750657f959e3743bc5edChet Haase * within its bounds, allowing everything behind it to show through. A TRANSLUCENT drawable 86896a443b58d9c9849c846750657f959e3743bc5edChet Haase * is a drawable in any other state, where the drawable will draw some, but not all, 86996a443b58d9c9849c846750657f959e3743bc5edChet Haase * of the content within its bounds and at least some content behind the drawable will 87096a443b58d9c9849c846750657f959e3743bc5edChet Haase * be visible. If the visibility of the drawable's contents cannot be determined, the 87196a443b58d9c9849c846750657f959e3743bc5edChet Haase * safest/best return value is TRANSLUCENT. 87296a443b58d9c9849c846750657f959e3743bc5edChet Haase * 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Generally a Drawable should be as conservative as possible with the 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value it returns. For example, if it contains multiple child drawables 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and only shows one of them at a time, if only one of the children is 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TRANSLUCENT and the others are OPAQUE then TRANSLUCENT should be 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned. You can use the method {@link #resolveOpacity} to perform a 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * standard reduction of two opacities to the appropriate single output. 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 880ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase * <p>Note that the returned value does not necessarily take into account a 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * custom alpha or color filter that has been applied by the client through 882ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase * the {@link #setAlpha} or {@link #setColorFilter} methods. Some subclasses, 883ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase * such as {@link BitmapDrawable}, {@link ColorDrawable}, and {@link GradientDrawable}, 884ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase * do account for the value of {@link #setAlpha}, but the general behavior is dependent 885ffb73620a24062c4c021f04254c3d4e8448b3dd3Chet Haase * upon the implementation of the subclass. 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int The opacity class of the Drawable. 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.graphics.PixelFormat 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 891b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public abstract @PixelFormat.Opacity int getOpacity(); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the appropriate opacity value for two source opacities. If 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either is UNKNOWN, that is returned; else, if either is TRANSLUCENT, 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is returned; else, if either is TRANSPARENT, that is returned; 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * else, OPAQUE is returned. 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>This is to help in implementing {@link #getOpacity}. 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op1 One opacity value. 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param op2 Another opacity value. 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return int The combined opacity value. 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getOpacity 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 908b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public static @PixelFormat.Opacity int resolveOpacity(@PixelFormat.Opacity int op1, 909b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @PixelFormat.Opacity int op2) { 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == op2) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return op1; 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == PixelFormat.UNKNOWN || op2 == PixelFormat.UNKNOWN) { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.UNKNOWN; 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == PixelFormat.TRANSLUCENT || op2 == PixelFormat.TRANSLUCENT) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.TRANSLUCENT; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (op1 == PixelFormat.TRANSPARENT || op2 == PixelFormat.TRANSPARENT) { 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.TRANSPARENT; 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.OPAQUE; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a Region representing the part of the Drawable that is completely 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transparent. This can be used to perform drawing operations, identifying 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which parts of the target will not change when rendering the Drawable. 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default implementation returns null, indicating no transparent 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * region; subclasses can optionally override this to return an actual 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Region if they want to supply this optimization information, but it is 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not required that they do so. 93323bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns null if the Drawables has no transparent region to 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * report, else a Region holding the parts of the Drawable's bounds that 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are transparent. 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 938b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @Nullable Region getTransparentRegion() { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 94123bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this in your subclass to change appearance if you recognize the 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified state. 94523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the state change has caused the appearance of 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the Drawable to change (that is, it needs to be drawn), else false 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it looks the same and there is no need to redraw it since its 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last state. 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 951b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette protected boolean onStateChange(int[] state) { 952b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette return false; 953b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette } 954b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette 9550b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette /** Override this in your subclass to change appearance if you vary based 9560b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * on level. 9570b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * @return Returns true if the level change has caused the appearance of 9580b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * the Drawable to change (that is, it needs to be drawn), else false 9590b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * if it looks the same and there is no need to redraw it since its 9600b6cfe22fda3396b4790ac79fc90488bec4a49a4Alan Viverette * last level. 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 962b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette protected boolean onLevelChange(int level) { 963b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette return false; 964b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette } 965b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 967c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen * Override this in your subclass to change appearance if you vary based on 968c502744f2ddcc80a34f5197b5d2c0d701c7d6e71Newton Allen * the bounds. 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 970b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette protected void onBoundsChange(Rect bounds) { 971b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette // Stub method. 972b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 97576165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * Returns the drawable's intrinsic width. 97676165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * <p> 97776165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * Intrinsic width is the width at which the drawable would like to be laid 97876165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * out, including any inherent padding. If the drawable has no intrinsic 97976165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * width, such as a solid color, this method returns -1. 98076165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * 98176165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * @return the intrinsic width, or -1 if no intrinsic width 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 98876165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * Returns the drawable's intrinsic height. 98976165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * <p> 99076165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * Intrinsic height is the height at which the drawable would like to be 99176165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * laid out, including any inherent padding. If the drawable has no 99276165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * intrinsic height, such as a solid color, this method returns -1. 99376165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * 99476165b2a4bc3b618bdfa9e4286d405892b68f122Alan Viverette * @return the intrinsic height, or -1 if no intrinsic height 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 99923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the minimum width suggested by this Drawable. If a View uses this 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable as a background, it is suggested that the View use at least this 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value for its width. (There will be some scenarios where this will not be 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible.) This value should INCLUDE any padding. 100523bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The minimum width suggested by this Drawable. If this Drawable 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doesn't have a suggested minimum width, 0 is returned. 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumWidth() { 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int intrinsicWidth = getIntrinsicWidth(); 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intrinsicWidth > 0 ? intrinsicWidth : 0; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the minimum height suggested by this Drawable. If a View uses this 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawable as a background, it is suggested that the View use at least this 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value for its height. (There will be some scenarios where this will not be 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible.) This value should INCLUDE any padding. 101923bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy * 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The minimum height suggested by this Drawable. If this Drawable 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * doesn't have a suggested minimum height, 0 is returned. 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinimumHeight() { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int intrinsicHeight = getIntrinsicHeight(); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intrinsicHeight > 0 ? intrinsicHeight : 0; 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 102723bd84ce6c448b73847eb404f3a1cc7b10afb6d6Romain Guy 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return in padding the insets suggested by this Drawable for placing 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content inside the drawable's bounds. Positive values move toward the 10317dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * center of the Drawable (set Rect.inset). 10327dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * 10337dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * @return true if this drawable actually has a padding, else false. When false is returned, 10347dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * the padding is always set to 0. 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10367dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik public boolean getPadding(@NonNull Rect padding) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(0, 0, 0, 0); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10421557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * Return in insets the layout insets suggested by this Drawable for use with alignment 1043bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne * operations during layout. 10441557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * 10451557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne * @hide 10461557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne */ 1047b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @NonNull Insets getOpticalInsets() { 1048bbd51f1e360b22eece1d74bd65c7e6a0b59dee59Philip Milne return Insets.NONE; 10491557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne } 10501557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne 10511557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne /** 10529a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * Called to get the drawable to populate the Outline that defines its drawing area. 1053b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik * <p> 10549a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * This method is called by the default {@link android.view.ViewOutlineProvider} to define 10559a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * the outline of the View. 10567dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * <p> 105777b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik * The default behavior defines the outline to be the bounding rectangle of 0 alpha. 105877b5cad3efedd20f2b7cc14d87ccce1b0261960aChris Craik * Subclasses that wish to convey a different shape or alpha value must override this method. 10597dc5b41e609d3ff55ca194682832d14a7236fa87Chris Craik * 10609a347f199284ad8bcb8a81bfbd306fe0b1a710baChris Craik * @see android.view.View#setOutlineProvider(android.view.ViewOutlineProvider) 1061b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik */ 106231ba192dd201df2cad96a8c503f730130ab0d80fChris Craik public void getOutline(@NonNull Outline outline) { 1063e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik outline.setRect(getBounds()); 10643f873d86441c30f5d45640a9f70b3b7331985c90Chris Craik outline.setAlpha(0); 1065e6a39b12656ab8d5c77d8366b24aa6410fd42e11Chris Craik } 1066b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik 1067b49f446c98096c4790a11d9b5bc83a4e585278c9Chris Craik /** 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Make this drawable mutable. This operation cannot be reversed. A mutable 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawable is guaranteed to not share its state with any other drawable. 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is especially useful when you need to modify properties of drawables 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loaded from resources. By default, all drawables instances loaded from 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same resource share a common state; if you modify the state of one 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instance, all the other instances will receive the same modification. 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calling this method on a mutable Drawable will have no effect. 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return This drawable. 10781e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see ConstantState 10791e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see #getConstantState() 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1081b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @NonNull Drawable mutate() { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1086727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * Clears the mutated state, allowing this drawable to be cached and 1087727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * mutated again. 1088727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * <p> 1089727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * This is hidden because only framework drawables can be cached, so 1090727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * custom drawables don't need to support constant state, mutate(), or 1091727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * clearMutated(). 1092727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * 1093727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette * @hide 1094727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette */ 1095727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette public void clearMutated() { 1096727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette // Default implementation is no-op. 1097727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette } 1098727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette 1099727cae197b123ef764a1f8fbe08a995b000d14c3Alan Viverette /** 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a drawable from an inputstream 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromStream(InputStream is, String srcName) { 11030acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable"); 11040acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn try { 11056dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette return createFromResourceStream(null, null, is, srcName); 11060acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } finally { 11070acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 11080acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 111211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * Create a drawable from an inputstream, using the given resources and 111311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn * value to determine density information. 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromResourceStream(Resources res, TypedValue value, 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream is, String srcName) { 11170acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable"); 11180acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn try { 1119910a0b4d02d0be3e164a32825785fa3d02fe55a2Alan Viverette return createFromResourceStream(res, value, is, srcName, null); 11200acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } finally { 11210acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 11220acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } 11237341d7a104b47996445d069a695e155a07184606Dianne Hackborn } 11247341d7a104b47996445d069a695e155a07184606Dianne Hackborn 11257341d7a104b47996445d069a695e155a07184606Dianne Hackborn /** 11267341d7a104b47996445d069a695e155a07184606Dianne Hackborn * Create a drawable from an inputstream, using the given resources and 11277341d7a104b47996445d069a695e155a07184606Dianne Hackborn * value to determine density information. 11287341d7a104b47996445d069a695e155a07184606Dianne Hackborn */ 11297341d7a104b47996445d069a695e155a07184606Dianne Hackborn public static Drawable createFromResourceStream(Resources res, TypedValue value, 11307341d7a104b47996445d069a695e155a07184606Dianne Hackborn InputStream is, String srcName, BitmapFactory.Options opts) { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is == null) { 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* ugh. The decodeStream contract is that we have already allocated 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project the pad rect, but if the bitmap does not had a ninepatch chunk, 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project then the pad will be ignored. If we could change this to lazily 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alloc/assign the rect, we could avoid the GC churn of making new 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rects only to drop them on the floor. 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect pad = new Rect(); 1142e5e92602a41a4ddc7b42cd1c171a0edfbd09b8daztenghui 114311ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // Special stuff for compatibility mode: if the target density is not 114411ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // the same as the display density, but the resource -is- the same as 114511ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // the display density, then don't scale it down to the target density. 114611ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // This allows us to load the system's density-correct resources into 114711ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // an application in compatibility mode, without scaling those down 114811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // to the compatibility density only to have them scaled back up when 114911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn // drawn to the screen. 11507341d7a104b47996445d069a695e155a07184606Dianne Hackborn if (opts == null) opts = new BitmapFactory.Options(); 1151ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette opts.inScreenDensity = Drawable.resolveDensity(res, 0); 115211ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn Bitmap bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bm != null) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] np = bm.getNinePatchChunk(); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (np == null || !NinePatch.isNinePatchChunk(np)) { 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project np = null; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pad = null; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette 1160c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette final Rect opticalInsets = new Rect(); 1161c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette bm.getOpticalInsets(opticalInsets); 1162c054966b719c8a7255f7cf4120cca5050acb68bdAlan Viverette return drawableFromBitmap(res, bm, np, pad, opticalInsets, srcName); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a drawable from an XML document. For more information on how to 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * create resources in XML, see 1170dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>. 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromXml(Resources r, XmlPullParser parser) 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 11746dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette return createFromXml(r, parser, null); 117552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 117652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 117752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 11786dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * Create a drawable from an XML document using an optional {@link Theme}. 11796dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * For more information on how to create resources in XML, see 118052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * <a href="{@docRoot}guide/topics/resources/drawable-resource.html">Drawable Resources</a>. 118152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 11826dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette public static Drawable createFromXml(Resources r, XmlPullParser parser, Theme theme) 118352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throws XmlPullParserException, IOException { 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = Xml.asAttributeSet(parser); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 1187b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette //noinspection StatementWithEmptyBody 1188b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette while ((type=parser.next()) != XmlPullParser.START_TAG 1189b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette && type != XmlPullParser.END_DOCUMENT) { 1190b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette // Empty loop. 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != XmlPullParser.START_TAG) { 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new XmlPullParserException("No start tag found"); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11976dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette Drawable drawable = createFromXmlInner(r, parser, attrs, theme); 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (drawable == null) { 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unknown initial tag: " + parser.getName()); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawable; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create from inside an XML document. Called on a parser positioned at 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a tag in an XML document, tries to create a Drawable from that tag. 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns null if the tag is not a valid drawable. 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs) 121252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throws XmlPullParserException, IOException { 12136dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette return createFromXmlInner(r, parser, attrs, null); 121452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1216e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette /** 12176dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * Create a drawable from inside an XML document using an optional 12186dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * {@link Theme}. Called on a parser positioned at a tag in an XML 12196dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * document, tries to create a Drawable from that tag. Returns {@code null} 12206dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette * if the tag is not a valid drawable. 1221e5b082d6eb0489e7dbe3159338f8c94c0af61deeAlan Viverette */ 12226dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs, 12236dbe51b50e82057af4d29882889444d22ac19c9cAlan Viverette Theme theme) throws XmlPullParserException, IOException { 122402fc5fef36357467eba22a0ee250a96734daf791Alan Viverette return r.getDrawableInflater().inflateFromXml(parser.getName(), parser, attrs, theme); 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a drawable from file path name. 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Drawable createFromPath(String pathName) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pathName == null) { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12350acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, pathName); 12360acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn try { 12370acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Bitmap bm = BitmapFactory.decodeFile(pathName); 12380acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn if (bm != null) { 12390acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn return drawableFromBitmap(null, bm, null, null, null, pathName); 12400acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } 12410acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn } finally { 12420acc1931d364fabb32e2051f58bfbbc5f2505176Dianne Hackborn Trace.traceEnd(Trace.TRACE_TAG_RESOURCES); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12481e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 124952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Inflate this Drawable from an XML resource. Does not apply a theme. 125052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 125152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @see #inflate(Resources, XmlPullParser, AttributeSet, Theme) 12521e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 12537e3ede288926bdfb79b1571fed74cad614935821Alan Viverette public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser, 12547e3ede288926bdfb79b1571fed74cad614935821Alan Viverette @NonNull AttributeSet attrs) throws XmlPullParserException, IOException { 125552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette inflate(r, parser, attrs, null); 125652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 125752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 125852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 125952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Inflate this Drawable from an XML resource optionally styled by a theme. 12604eab3850ec1a6cd3ec86f0c648497ee51c3ac609Teng-Hui Zhu * This can't be called more than once for each Drawable. Note that framework may have called 12614eab3850ec1a6cd3ec86f0c648497ee51c3ac609Teng-Hui Zhu * this once to create the Drawable instance from XML resource. 126252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * 126352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param r Resources used to resolve attribute values 126452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param parser XML parser from which to inflate this Drawable 126552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param attrs Base set of attribute values 126652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @param theme Theme to apply, may be null 126752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @throws XmlPullParserException 126852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * @throws IOException 126952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 12707e3ede288926bdfb79b1571fed74cad614935821Alan Viverette public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser, 12717e3ede288926bdfb79b1571fed74cad614935821Alan Viverette @NonNull AttributeSet attrs, @Nullable Theme theme) 127252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette throws XmlPullParserException, IOException { 12737e3ede288926bdfb79b1571fed74cad614935821Alan Viverette final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.Drawable); 12747e3ede288926bdfb79b1571fed74cad614935821Alan Viverette mVisible = a.getBoolean(R.styleable.Drawable_visible, mVisible); 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12781e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 12791e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Inflate a Drawable from an XML resource. 12801e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * 12811e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @throws XmlPullParserException 12821e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @throws IOException 12831e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 1284b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette void inflateWithAttributes(@NonNull @SuppressWarnings("unused") Resources r, 1285b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @NonNull @SuppressWarnings("unused") XmlPullParser parser, @NonNull TypedArray attrs, 1286b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @AttrRes int visibleAttr) throws XmlPullParserException, IOException { 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVisible = attrs.getBoolean(visibleAttr, mVisible); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12901e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 12911e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * This abstract class is used by {@link Drawable}s to store shared constant state and data 12921e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * between Drawables. {@link BitmapDrawable}s created from the same resource will for instance 12931e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * share a unique bitmap stored in their ConstantState. 12941e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * 12951e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * <p> 12961e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * {@link #newDrawable(Resources)} can be used as a factory to create new Drawable instances 12971e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * from this ConstantState. 12981e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * </p> 12991e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * 13001e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Use {@link Drawable#getConstantState()} to retrieve the ConstantState of a Drawable. Calling 13011e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * {@link Drawable#mutate()} on a Drawable should typically create a new ConstantState for that 13021e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Drawable. 13031e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class ConstantState { 1305c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn /** 1306477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * Creates a new Drawable instance from its constant state. 1307477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * <p> 1308477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * <strong>Note:</strong> Using this method means density-dependent 1309477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * properties, such as pixel dimensions or bitmap images, will not be 1310477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * updated to match the density of the target display. To ensure 1311477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * correct scaling, use {@link #newDrawable(Resources)} instead to 1312477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * provide an appropriate Resources object. 1313477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * 1314477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * @return a new drawable object based on this constant state 1315477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * @see {@link #newDrawable(Resources)} 1316c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn */ 1317b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public abstract @NonNull Drawable newDrawable(); 131852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 1319c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn /** 1320477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * Creates a new Drawable instance from its constant state using the 1321477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * specified resources. This method should be implemented for drawables 1322477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * that have density-dependent properties. 1323477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * <p> 1324477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * The default implementation for this method calls through to 1325477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * {@link #newDrawable()}. 1326477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * 1327477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * @param res the resources of the context in which the drawable will 1328477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * be displayed 1329477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * @return a new drawable object based on this constant state 1330c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn */ 1331b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @NonNull Drawable newDrawable(@Nullable Resources res) { 1332c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn return newDrawable(); 1333c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn } 133452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 133552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 1336477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * Creates a new Drawable instance from its constant state using the 1337477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * specified resources and theme. This method should be implemented for 1338477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * drawables that have theme-dependent properties. 1339477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * <p> 1340477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * The default implementation for this method calls through to 1341477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * {@link #newDrawable(Resources)}. 1342477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * 1343477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * @param res the resources of the context in which the drawable will 1344477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * be displayed 1345477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * @param theme the theme of the context in which the drawable will be 1346477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * displayed 1347477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette * @return a new drawable object based on this constant state 134852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 1349b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @NonNull Drawable newDrawable(@Nullable Resources res, 1350b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @Nullable @SuppressWarnings("unused") Theme theme) { 1351477f3d092db302d24dcaa77bbcdd1026c9a468a4Alan Viverette return newDrawable(res); 135252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 135352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 1354c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn /** 1355c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * Return a bit mask of configuration changes that will impact 1356c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn * this drawable (and thus require completely reloading it). 1357c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn */ 1358ac85f90466dd60d2af8ffc3942d503a0de606726Alan Viverette public abstract @Config int getChangingConfigurations(); 13593b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy 13603b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy /** 1361dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck * @return Total pixel count 13623b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy * @hide 13633b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy */ 1364b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public int addAtlasableBitmaps(@NonNull Collection<Bitmap> atlasList) { 1365dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck return 0; 1366dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck } 1367dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck 1368dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck /** @hide */ 1369b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette protected final boolean isAtlasable(@Nullable Bitmap bitmap) { 1370dad7d84c04c5954b63ea8bb58c52b2291f44b4dfJohn Reck return bitmap != null && bitmap.getConfig() == Bitmap.Config.ARGB_8888; 13713b748a44c6bd2ea05fe16839caf73dbe50bd7ae9Romain Guy } 137252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 137352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 137452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Return whether this constant state can have a theme applied. 137552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 137652b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette public boolean canApplyTheme() { 137752b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return false; 137852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13811e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne /** 13821e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * Return a {@link ConstantState} instance that holds the shared state of this Drawable. 1383d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * 13841e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @return The ConstantState associated to that Drawable. 13851e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see ConstantState 13861e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne * @see Drawable#mutate() 13871e91b3fde0a1a76388c7f2a7fd67562c66818f2eGilles Debunne */ 1388b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette public @Nullable ConstantState getConstantState() { 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static Drawable drawableFromBitmap(Resources res, Bitmap bm, byte[] np, 1393ec4a50428d5f26a22df3edaf7e5b08f41d5cb54bAmith Yamasani Rect pad, Rect layoutBounds, String srcName) { 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (np != null) { 13961557fd7809078e421f751efc7d2539b3efdc54b2Philip Milne return new NinePatchDrawable(res, bm, np, pad, layoutBounds, srcName); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn return new BitmapDrawable(res, bm); 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1401d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette 1402d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette /** 1403b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette * Ensures the tint filter is consistent with the current tint color and 1404b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette * mode. 1405b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette */ 1406b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @Nullable PorterDuffColorFilter updateTintFilter(@Nullable PorterDuffColorFilter tintFilter, 1407b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @Nullable ColorStateList tint, @Nullable PorterDuff.Mode tintMode) { 1408b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (tint == null || tintMode == null) { 1409b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette return null; 1410b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 1411b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 1412b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette final int color = tint.getColorForState(getState(), Color.TRANSPARENT); 1413b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette if (tintFilter == null) { 1414b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette return new PorterDuffColorFilter(color, tintMode); 1415b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 1416b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 1417b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette tintFilter.setColor(color); 1418b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette tintFilter.setMode(tintMode); 1419b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette return tintFilter; 1420b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette } 1421b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette 1422b3c56086d802ae28888dd97ba1f49bd6cee0b673Alan Viverette /** 142352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * Obtains styled attributes from the theme, if available, or unstyled 142452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette * resources if the theme is null. 142552b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette */ 1426b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette static @NonNull TypedArray obtainAttributes(@NonNull Resources res, @Nullable Theme theme, 1427b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette @NonNull AttributeSet set, @NonNull int[] attrs) { 142852b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette if (theme == null) { 142952b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return res.obtainAttributes(set, attrs); 143052b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 143152b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette return theme.obtainStyledAttributes(set, attrs, 0, 0); 143252b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette } 143352b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette 143452b999f0721b53e9c6e18a4bd664e89aeb65b2d5Alan Viverette /** 1435ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * Scales a floating-point pixel value from the source density to the 1436ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * target density. 1437ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * 1438ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @param pixels the pixel value for use in source density 1439ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @param sourceDensity the source density 1440ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @param targetDensity the target density 1441ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @return the scaled pixel value for use in target density 1442ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette */ 1443ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette static float scaleFromDensity(float pixels, int sourceDensity, int targetDensity) { 1444ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette return pixels * targetDensity / sourceDensity; 1445ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } 1446ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette 1447ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette /** 1448ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * Scales a pixel value from the source density to the target density, 1449ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * optionally handling the resulting pixel value as a size rather than an 1450ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * offset. 1451ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * <p> 1452ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * A size conversion involves rounding the base value and ensuring that 1453ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * a non-zero base value is at least one pixel in size. 1454ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * <p> 1455ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * An offset conversion involves simply truncating the base value to an 1456ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * integer. 1457ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * 1458ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @param pixels the pixel value for use in source density 1459ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @param sourceDensity the source density 1460ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @param targetDensity the target density 1461ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @param isSize {@code true} to handle the resulting scaled value as a 1462ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * size, or {@code false} to handle it as an offset 1463ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette * @return the scaled pixel value for use in target density 1464ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette */ 1465ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette static int scaleFromDensity( 1466ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette int pixels, int sourceDensity, int targetDensity, boolean isSize) { 1467ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette if (pixels == 0 || sourceDensity == targetDensity) { 1468ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette return pixels; 1469ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } 1470ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette 1471ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette final float result = pixels * targetDensity / (float) sourceDensity; 1472ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette if (!isSize) { 1473ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette return (int) result; 1474ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } 1475ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette 1476ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette final int rounded = Math.round(result); 1477ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette if (rounded != 0) { 1478ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette return rounded; 1479ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } else if (pixels > 0) { 1480ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette return 1; 1481ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } else { 1482ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette return -1; 1483ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } 1484ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } 1485ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette 1486d633ca417d3925521ab15fba1c0cdac172efb184Alan Viverette static int resolveDensity(@Nullable Resources r, int parentDensity) { 1487ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette final int densityDpi = r == null ? parentDensity : r.getDisplayMetrics().densityDpi; 1488ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette return densityDpi == 0 ? DisplayMetrics.DENSITY_DEFAULT : densityDpi; 1489ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette } 1490ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette 1491ce52037e0ae0c380f5b834fb3dad105bfaf5e374Alan Viverette /** 1492c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette * Re-throws an exception as a {@link RuntimeException} with an empty stack 1493c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette * trace to avoid cluttering the log. The original exception's stack trace 1494c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette * will still be included. 1495c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette * 1496c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette * @param cause the exception to re-throw 1497c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette * @throws RuntimeException 1498c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette */ 1499b8cbb806fc70573def954f7ba84dd7b53b3be1bdAlan Viverette static void rethrowAsRuntimeException(@NonNull Exception cause) throws RuntimeException { 1500c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette final RuntimeException e = new RuntimeException(cause); 1501c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette e.setStackTrace(new StackTraceElement[0]); 1502c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette throw e; 1503c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette } 1504c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette 1505c078c605ab904b0e4a5d793cbeffd78c340f2816Alan Viverette /** 150612b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode 1507d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette * attribute's enum value. 1508911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette * 1509911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette * @hide 1510d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette */ 1511911743652b597057a1bd7ef8a921e9ff8dce0f4aAlan Viverette public static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) { 151212b97f5d2b15194ed6673c9838b13c8312157709Alan Viverette switch (value) { 15132f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 3: return Mode.SRC_OVER; 15142f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 5: return Mode.SRC_IN; 15152f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 9: return Mode.SRC_ATOP; 15162f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 14: return Mode.MULTIPLY; 15172f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 15: return Mode.SCREEN; 15182f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette case 16: return Mode.ADD; 15192f8ba8f7fad2b608102a9282219aaea2223e94f5Alan Viverette default: return defaultMode; 1520d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette } 1521d9e788c4f0528e46db4a035cfac043736becb0d1Alan Viverette } 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1524