19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.graphics.drawable; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.*; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.shapes.Shape; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Drawable object that draws primitive shapes. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A ShapeDrawable takes a {@link android.graphics.drawable.shapes.Shape} 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object and manages its presence on the screen. If no Shape is given, then 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the ShapeDrawable will default to a 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.drawable.shapes.RectShape}. 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3761fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <p>This object can be defined in an XML file with the <code><shape></code> element.</p> 3861fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * 3961fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <div class="special reference"> 4061fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <h3>Developer Guides</h3> 4161fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <p>For more information about how to use ShapeDrawable, read the 4261fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/graphics/2d-graphics.html#shape-drawable"> 4361fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * Canvas and Drawables</a> document. For more information about defining a ShapeDrawable in 4461fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * XML, read the 4561fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * <a href="{@docRoot}guide/topics/resources/drawable-resource.html#Shape">Drawable Resources</a> 4661fd1e8d8c3ccf2d6b7d4af1c19e8f0988d5a1ecJoe Fernandez * document.</p></div> 47dfe5c204403bc56c29bb36410574eab8b1950417Scott Main * 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ShapeDrawablePadding_left 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ShapeDrawablePadding_top 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ShapeDrawablePadding_right 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ShapeDrawablePadding_bottom 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ShapeDrawable_color 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ShapeDrawable_width 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ShapeDrawable_height 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ShapeDrawable extends Drawable { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ShapeState mShapeState; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMutated; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ShapeDrawable constructor. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ShapeDrawable() { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this((ShapeState) null); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a ShapeDrawable with a specified Shape. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param s the Shape that this ShapeDrawable should be 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ShapeDrawable(Shape s) { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this((ShapeState) null); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mShape = s; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ShapeDrawable(ShapeState state) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState = new ShapeState(state); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Shape of this ShapeDrawable. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Shape getShape() { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShapeState.mShape; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the Shape of this ShapeDrawable. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShape(Shape s) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mShape = s; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateShape(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets a ShaderFactory to which requests for a 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.Shader} object will be made. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fact an instance of your ShaderFactory implementation 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShaderFactory(ShaderFactory fact) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mShaderFactory = fact; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the ShaderFactory used by this ShapeDrawable for requesting a 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.Shader}. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ShaderFactory getShaderFactory() { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShapeState.mShaderFactory; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Paint used to draw the shape. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Paint getPaint() { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShapeState.mPaint; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets padding for the shape. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left padding for the left side (in pixels) 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top padding for the top (in pixels) 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right padding for the right side (in pixels) 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom padding for the bottom (in pixels) 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPadding(int left, int top, int right, int bottom) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((left | top | right | bottom) == 0) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPadding = null; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShapeState.mPadding == null) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPadding = new Rect(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPadding.set(left, top, right, bottom); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets padding for this shape, defined by a Rect object. 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Define the padding in the Rect object as: left, top, right, bottom. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPadding(Rect padding) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (padding == null) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPadding = null; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShapeState.mPadding == null) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPadding = new Rect(); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPadding.set(padding); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the intrinsic (default) width for this shape. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the intrinsic width (in pixels) 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIntrinsicWidth(int width) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mIntrinsicWidth = width; 1659891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the intrinsic (default) height for this shape. 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the intrinsic height (in pixels) 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIntrinsicHeight(int height) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mIntrinsicHeight = height; 1759891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicWidth() { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShapeState.mIntrinsicWidth; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getIntrinsicHeight() { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShapeState.mIntrinsicHeight; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPadding(Rect padding) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShapeState.mPadding != null) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project padding.set(mShapeState.mPadding); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getPadding(padding); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int modulateAlpha(int paintAlpha, int alpha) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int scale = alpha + (alpha >>> 7); // convert to 0..256 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return paintAlpha * scale >>> 8; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called from the drawable's draw() method after the canvas has been set 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to draw the shape at (0,0). Subclasses can override for special effects 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * such as multiple layers, stroking, etc. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onDraw(Shape shape, Canvas canvas, Paint paint) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project shape.draw(canvas, paint); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(Canvas canvas) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect r = getBounds(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Paint paint = mShapeState.mPaint; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int prevAlpha = paint.getAlpha(); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paint.setAlpha(modulateAlpha(prevAlpha, mShapeState.mAlpha)); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShapeState.mShape != null) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // need the save both for the translate, and for the (unknown) Shape 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = canvas.save(); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(r.left, r.top); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onDraw(mShapeState.mShape, canvas, paint); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restoreToCount(count); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.drawRect(r, paint); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // restore 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project paint.setAlpha(prevAlpha); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getChangingConfigurations() 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | mShapeState.mChangingConfigurations; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the alpha level for this drawable [0..255]. Note that this drawable 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also has a color in its paint, which has an alpha as well. These two 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values are automatically combined during drawing. Thus if the color's 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * alpha is 75% (i.e. 192) and the drawable's alpha is 50% (i.e. 128), then 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the combined alpha that will be used during drawing will be 37.5% 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (i.e. 96). 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public void setAlpha(int alpha) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mAlpha = alpha; 2509891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setColorFilter(ColorFilter cf) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPaint.setColorFilter(cf); 2569891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getOpacity() { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShapeState.mShape == null) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Paint p = mShapeState.mPaint; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.getXfermode() == null) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int alpha = p.getAlpha(); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha == 0) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.TRANSPARENT; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha == 255) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.OPAQUE; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not sure, so be safe 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return PixelFormat.TRANSLUCENT; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDither(boolean dither) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPaint.setDither(dither); 2809891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onBoundsChange(Rect bounds) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onBoundsChange(bounds); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateShape(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Subclasses override this to parse custom subelements. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you handle it, return true, else return <em>super.inflateTag(...)</em>. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean inflateTag(String name, Resources r, XmlPullParser parser, 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 296ed7894352f8addfe3d0da75cc7fe8bc6fef201dcRomain Guy if ("padding".equals(name)) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = r.obtainAttributes(attrs, 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.ShapeDrawablePadding); 29990cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach setPadding( 30090cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach a.getDimensionPixelOffset( 30190cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach com.android.internal.R.styleable.ShapeDrawablePadding_left, 0), 30290cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach a.getDimensionPixelOffset( 30390cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach com.android.internal.R.styleable.ShapeDrawablePadding_top, 0), 30490cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach a.getDimensionPixelOffset( 30590cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach com.android.internal.R.styleable.ShapeDrawablePadding_right, 0), 30690cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach a.getDimensionPixelOffset( 30790cfa9df3f3b586eae49ee2d2533a05238d391a4Phil Dubach com.android.internal.R.styleable.ShapeDrawablePadding_bottom, 0)); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.inflate(r, parser, attrs); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.ShapeDrawable); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int color = mShapeState.mPaint.getColor(); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project color = a.getColor(com.android.internal.R.styleable.ShapeDrawable_color, color); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPaint.setColor(color); 325ed7894352f8addfe3d0da75cc7fe8bc6fef201dcRomain Guy 326ed7894352f8addfe3d0da75cc7fe8bc6fef201dcRomain Guy boolean dither = a.getBoolean(com.android.internal.R.styleable.ShapeDrawable_dither, false); 327ed7894352f8addfe3d0da75cc7fe8bc6fef201dcRomain Guy mShapeState.mPaint.setDither(dither); 328ed7894352f8addfe3d0da75cc7fe8bc6fef201dcRomain Guy 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIntrinsicWidth((int) 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getDimension(com.android.internal.R.styleable.ShapeDrawable_width, 0f)); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setIntrinsicHeight((int) 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.getDimension(com.android.internal.R.styleable.ShapeDrawable_height, 0f)); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int outerDepth = parser.getDepth(); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != XmlPullParser.START_TAG) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String name = parser.getName(); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // call our subclass 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!inflateTag(name, r, parser, attrs)) { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.util.Log.w("drawable", "Unknown element: " + name + 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " for ShapeDrawable " + this); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void updateShape() { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShapeState.mShape != null) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect r = getBounds(); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int w = r.width(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int h = r.height(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mShape.resize(w, h); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShapeState.mShaderFactory != null) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mPaint.setShader(mShapeState.mShaderFactory.resize(w, h)); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649891e1fce5f29d0421d34aa481037417bd70853dChet Haase invalidateSelf(); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ConstantState getConstantState() { 3696efd2bad954e0e5bd74916a32f036a0f149dcd4dChristopher Lais mShapeState.mChangingConfigurations = getChangingConfigurations(); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mShapeState; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable mutate() { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mMutated && super.mutate() == this) { 3761558cf1498ecc687532f2dad3de720053dca9309Romain Guy if (mShapeState.mPaint != null) { 3771558cf1498ecc687532f2dad3de720053dca9309Romain Guy mShapeState.mPaint = new Paint(mShapeState.mPaint); 3781558cf1498ecc687532f2dad3de720053dca9309Romain Guy } else { 3791558cf1498ecc687532f2dad3de720053dca9309Romain Guy mShapeState.mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 3801558cf1498ecc687532f2dad3de720053dca9309Romain Guy } 3811558cf1498ecc687532f2dad3de720053dca9309Romain Guy if (mShapeState.mPadding != null) { 3821558cf1498ecc687532f2dad3de720053dca9309Romain Guy mShapeState.mPadding = new Rect(mShapeState.mPadding); 3831558cf1498ecc687532f2dad3de720053dca9309Romain Guy } else { 3841558cf1498ecc687532f2dad3de720053dca9309Romain Guy mShapeState.mPadding = new Rect(); 3851558cf1498ecc687532f2dad3de720053dca9309Romain Guy } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShapeState.mShape = mShapeState.mShape.clone(); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CloneNotSupportedException e) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMutated = true; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Defines the intrinsic properties of this ShapeDrawable's Shape. 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final static class ShapeState extends ConstantState { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mChangingConfigurations; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Paint mPaint; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Shape mShape; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect mPadding; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mIntrinsicWidth; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mIntrinsicHeight; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mAlpha = 255; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ShaderFactory mShaderFactory; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ShapeState(ShapeState orig) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (orig != null) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaint = orig.mPaint; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShape = orig.mShape; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPadding = orig.mPadding; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIntrinsicWidth = orig.mIntrinsicWidth; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIntrinsicHeight = orig.mIntrinsicHeight; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlpha = orig.mAlpha; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShaderFactory = orig.mShaderFactory; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable newDrawable() { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ShapeDrawable(this); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 429c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn public Drawable newDrawable(Resources res) { 430c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn return new ShapeDrawable(this); 431c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn } 432c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn 433c2974809373697147cbe5754835cc871fb93aef1Dianne Hackborn @Override 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChangingConfigurations() { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChangingConfigurations; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class defines a factory object that is called each time the drawable 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is resized (has a new width or height). Its resize() method returns a 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corresponding shader, or null. 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implement this class if you'd like your ShapeDrawable to use a special 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.Shader}, such as a 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.LinearGradient}. 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class ShaderFactory { 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the Shader to be drawn when a Drawable is drawn. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The dimensions of the Drawable are passed because they may be needed 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to adjust how the Shader is configured for drawing. 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is called by ShapeDrawable.setShape(). 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width of the Drawable being drawn 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the heigh of the Drawable being drawn 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Shader to be drawn 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Shader resize(int width, int height); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // other subclass could wack the Shader's localmatrix based on the 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // resize params (e.g. scaletofit, etc.). This could be used to scale 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a bitmap to fill the bounds without needing any other special casing. 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 467