Loading api/current.txt +15 −13 Original line number Diff line number Diff line Loading @@ -345,7 +345,7 @@ package android { field public static final int canRetrieveWindowContent = 16843653; // 0x1010385 field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230 field public static final deprecated int capitalize = 16843113; // 0x1010169 field public static final int castsShadow = 16843778; // 0x1010402 field public static final int castsShadow = 16843777; // 0x1010401 field public static final int category = 16843752; // 0x10103e8 field public static final int centerBright = 16842956; // 0x10100cc field public static final int centerColor = 16843275; // 0x101020b Loading Loading @@ -379,8 +379,6 @@ package android { field public static final int colorActivatedHighlight = 16843664; // 0x1010390 field public static final int colorBackground = 16842801; // 0x1010031 field public static final int colorBackgroundCacheHint = 16843435; // 0x10102ab field public static final int colorFilterColor = 16843767; // 0x10103f7 field public static final int colorFilterMode = 16843768; // 0x10103f8 field public static final int colorFocusedHighlight = 16843663; // 0x101038f field public static final int colorForeground = 16842800; // 0x1010030 field public static final int colorForegroundInverse = 16843270; // 0x1010206 Loading @@ -401,10 +399,10 @@ package android { field public static final int content = 16843355; // 0x101025b field public static final int contentAuthority = 16843408; // 0x1010290 field public static final int contentDescription = 16843379; // 0x1010273 field public static final int controlX1 = 16843770; // 0x10103fa field public static final int controlX2 = 16843772; // 0x10103fc field public static final int controlY1 = 16843771; // 0x10103fb field public static final int controlY2 = 16843773; // 0x10103fd field public static final int controlX1 = 16843769; // 0x10103f9 field public static final int controlX2 = 16843771; // 0x10103fb field public static final int controlY1 = 16843770; // 0x10103fa field public static final int controlY2 = 16843772; // 0x10103fc field public static final int cropToPadding = 16843043; // 0x1010123 field public static final int cursorVisible = 16843090; // 0x1010152 field public static final int customNavigationLayout = 16843474; // 0x10102d2 Loading Loading @@ -544,7 +542,7 @@ package android { field public static final int fromAlpha = 16843210; // 0x10101ca field public static final int fromDegrees = 16843187; // 0x10101b3 field public static final int fromScene = 16843741; // 0x10103dd field public static final int fromSceneName = 16843774; // 0x10103fe field public static final int fromSceneName = 16843773; // 0x10103fd field public static final int fromXDelta = 16843206; // 0x10101c6 field public static final int fromXScale = 16843202; // 0x10101c2 field public static final int fromYDelta = 16843208; // 0x10101c8 Loading Loading @@ -639,7 +637,7 @@ package android { field public static final int isScrollContainer = 16843342; // 0x101024e field public static final int isSticky = 16843335; // 0x1010247 field public static final int isolatedProcess = 16843689; // 0x10103a9 field public static final int isolatedZVolume = 16843769; // 0x10103f9 field public static final int isolatedZVolume = 16843768; // 0x10103f8 field public static final int itemBackground = 16843056; // 0x1010130 field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131 field public static final int itemPadding = 16843565; // 0x101032d Loading Loading @@ -962,7 +960,7 @@ package android { field public static final int shadowRadius = 16843108; // 0x1010164 field public static final int shape = 16843162; // 0x101019a field public static final int shareInterpolator = 16843195; // 0x10101bb field public static final int sharedElementName = 16843776; // 0x1010400 field public static final int sharedElementName = 16843775; // 0x10103ff field public static final int sharedUserId = 16842763; // 0x101000b field public static final int sharedUserLabel = 16843361; // 0x1010261 field public static final int shouldDisableView = 16843246; // 0x10101ee Loading Loading @@ -1139,13 +1137,14 @@ package android { field public static final int tileMode = 16843265; // 0x1010201 field public static final int timeZone = 16843724; // 0x10103cc field public static final int tint = 16843041; // 0x1010121 field public static final int tintMode = 16843767; // 0x10103f7 field public static final int title = 16843233; // 0x10101e1 field public static final int titleCondensed = 16843234; // 0x10101e2 field public static final int titleTextStyle = 16843512; // 0x10102f8 field public static final int toAlpha = 16843211; // 0x10101cb field public static final int toDegrees = 16843188; // 0x10101b4 field public static final int toScene = 16843742; // 0x10103de field public static final int toSceneName = 16843775; // 0x10103ff field public static final int toSceneName = 16843774; // 0x10103fe field public static final int toXDelta = 16843207; // 0x10101c7 field public static final int toXScale = 16843203; // 0x10101c3 field public static final int toYDelta = 16843209; // 0x10101c9 Loading @@ -1161,7 +1160,7 @@ package android { field public static final int transformPivotX = 16843552; // 0x1010320 field public static final int transformPivotY = 16843553; // 0x1010321 field public static final int transition = 16843743; // 0x10103df field public static final int transitionGroup = 16843777; // 0x1010401 field public static final int transitionGroup = 16843776; // 0x1010400 field public static final int transitionOrdering = 16843744; // 0x10103e0 field public static final int translationX = 16843554; // 0x1010322 field public static final int translationY = 16843555; // 0x1010323 Loading Loading @@ -10410,6 +10409,8 @@ package android.graphics.drawable { method public void setTileModeX(android.graphics.Shader.TileMode); method public void setTileModeXY(android.graphics.Shader.TileMode, android.graphics.Shader.TileMode); method public final void setTileModeY(android.graphics.Shader.TileMode); method public void setTint(android.content.res.ColorStateList); method public void setTintMode(android.graphics.PorterDuff.Mode); } public class ClipDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback { Loading Loading @@ -10551,7 +10552,6 @@ package android.graphics.drawable { method public float getGradientRadius(); method public int getOpacity(); method public android.graphics.drawable.GradientDrawable.Orientation getOrientation(); method public boolean onStateChange(int[]); method public void setAlpha(int); method public void setColor(int); method public void setColor(android.content.res.ColorStateList); Loading Loading @@ -10646,6 +10646,8 @@ package android.graphics.drawable { method public void setTargetDensity(android.graphics.Canvas); method public void setTargetDensity(android.util.DisplayMetrics); method public void setTargetDensity(int); method public void setTint(android.content.res.ColorStateList); method public void setTintMode(android.graphics.PorterDuff.Mode); } public class PaintDrawable extends android.graphics.drawable.ShapeDrawable { core/res/res/values/attrs.xml +21 −17 Original line number Diff line number Diff line Loading @@ -4094,19 +4094,6 @@ RTL (right-to-left). See {@link android.graphics.drawable.Drawable#setAutoMirrored}. --> <attr name="autoMirrored" format="boolean" /> <!-- If set, specifies the color to apply to the drawable as a color filter. By default, no color filter is applied. --> <attr name="colorFilterColor" format="color" /> <!-- When a color filter color is set, specifies its Porter-Duff blending mode. The default value is multiply. --> <attr name="colorFilterMode"> <!-- [Sa * Da, Sc * Dc] --> <enum name="multiply" value="14" /> <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] --> <enum name="screen" value="15" /> <!-- [Da, Sc * Da + (1 - Sa) * Dc] --> <enum name="src_atop" value="9" /> </attr> </declare-styleable> <!-- Drawable used to render several states. Each state is represented by Loading Loading @@ -4391,8 +4378,21 @@ <!-- Indicates if the drawable needs to be mirrored when its layout direction is RTL (right-to-left). --> <attr name="autoMirrored" /> <attr name="colorFilterColor" /> <attr name="colorFilterMode" /> <!-- If set, specifies the color to apply to the drawable as a tint. By default, no tint is applied. May be a color state list. --> <attr name="tint" /> <!-- When a tint color is set, specifies its Porter-Duff blending mode. The default value is src_in, which treats the drawable as an alpha mask. --> <attr name="tintMode"> <!-- [Sa * Da, Sc * Da] --> <enum name="src_in" value="0" /> <!-- [Da, Sc * Da + (1 - Sa) * Dc] --> <enum name="src_atop" value="1" /> <!-- [Sa * Da, Sc * Dc] --> <enum name="multiply" value="2" /> <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] --> <enum name="screen" value="3" /> </attr> </declare-styleable> <!-- Drawable used to draw 9-patches. --> Loading @@ -4406,8 +4406,12 @@ <!-- Indicates if the drawable needs to be mirrored when its layout direction is RTL (right-to-left). --> <attr name="autoMirrored" /> <attr name="colorFilterColor" /> <attr name="colorFilterMode" /> <!-- If set, specifies the color to apply to the drawable as a tint. By default, no tint is applied. May be a color state list. --> <attr name="tint" /> <!-- When a tint color is set, specifies its Porter-Duff blending mode. The default value is src_in, which treats the drawable as an alpha mask. --> <attr name="tintMode" /> </declare-styleable> <!-- Drawable used to draw a single color. --> Loading core/res/res/values/public.xml +1 −2 Original line number Diff line number Diff line Loading @@ -2097,8 +2097,7 @@ <public type="attr" name="windowContentTransitions" /> <public type="attr" name="windowContentTransitionManager" /> <public type="attr" name="translationZ" /> <public type="attr" name="colorFilterColor" /> <public type="attr" name="colorFilterMode" /> <public type="attr" name="tintMode" /> <public type="attr" name="isolatedZVolume" /> <public type="attr" name="controlX1" /> <public type="attr" name="controlY1" /> Loading graphics/java/android/graphics/drawable/BitmapDrawable.java +177 −85 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.graphics.drawable; import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; Loading @@ -28,6 +29,8 @@ import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.GradientDrawable.GradientState; import android.graphics.Rect; import android.graphics.Shader; import android.graphics.Xfermode; Loading Loading @@ -68,6 +71,7 @@ public class BitmapDrawable extends Drawable { Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG; private BitmapState mBitmapState; private Bitmap mBitmap; private PorterDuffColorFilter mTintFilter; private int mTargetDensity; private final Rect mDstRect = new Rect(); // Gravity.apply() sets this Loading Loading @@ -457,25 +461,37 @@ public class BitmapDrawable extends Drawable { @Override public void draw(Canvas canvas) { Bitmap bitmap = mBitmap; if (bitmap != null) { final Bitmap bitmap = mBitmap; if (bitmap == null) { return; } final BitmapState state = mBitmapState; final Paint paint = state.mPaint; if (state.mRebuildShader) { Shader.TileMode tmx = state.mTileModeX; Shader.TileMode tmy = state.mTileModeY; final Shader.TileMode tmx = state.mTileModeX; final Shader.TileMode tmy = state.mTileModeY; if (tmx == null && tmy == null) { state.mPaint.setShader(null); paint.setShader(null); } else { state.mPaint.setShader(new BitmapShader(bitmap, paint.setShader(new BitmapShader(bitmap, tmx == null ? Shader.TileMode.CLAMP : tmx, tmy == null ? Shader.TileMode.CLAMP : tmy)); } state.mRebuildShader = false; copyBounds(mDstRect); } Shader shader = state.mPaint.getShader(); final boolean clearColorFilter; if (mTintFilter != null && paint.getColorFilter() == null) { paint.setColorFilter(mTintFilter); clearColorFilter = true; } else { clearColorFilter = false; } final Shader shader = paint.getShader(); final boolean needMirroring = needMirroring(); if (shader == null) { if (mApplyGravity) { Loading @@ -484,13 +500,16 @@ public class BitmapDrawable extends Drawable { getBounds(), mDstRect, layoutDirection); mApplyGravity = false; } if (needMirroring) { canvas.save(); // Mirror the bitmap canvas.translate(mDstRect.right - mDstRect.left, 0); canvas.scale(-1.0f, 1.0f); } canvas.drawBitmap(bitmap, null, mDstRect, state.mPaint); canvas.drawBitmap(bitmap, null, mDstRect, paint); if (needMirroring) { canvas.restore(); } Loading @@ -499,6 +518,7 @@ public class BitmapDrawable extends Drawable { copyBounds(mDstRect); mApplyGravity = false; } if (needMirroring) { // Mirror the bitmap updateMirrorMatrix(mDstRect.right - mDstRect.left); Loading @@ -509,14 +529,18 @@ public class BitmapDrawable extends Drawable { shader.setLocalMatrix(Matrix.IDENTITY_MATRIX); } } canvas.drawRect(mDstRect, state.mPaint); canvas.drawRect(mDstRect, paint); } if (clearColorFilter) { paint.setColorFilter(null); } } @Override public void setAlpha(int alpha) { int oldAlpha = mBitmapState.mPaint.getAlpha(); final int oldAlpha = mBitmapState.mPaint.getAlpha(); if (alpha != oldAlpha) { mBitmapState.mPaint.setAlpha(alpha); invalidateSelf(); Loading @@ -534,6 +558,43 @@ public class BitmapDrawable extends Drawable { invalidateSelf(); } /** * Specifies a tint for this drawable. * <p> * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides * tint. * * @param tint Color state list to use for tinting this drawable, or null to * clear the tint */ public void setTint(ColorStateList tint) { mBitmapState.mTint = tint; if (mTintFilter == null) { if (tint != null) { final int color = tint.getColorForState(getState(), 0); mTintFilter = new PorterDuffColorFilter(color, mBitmapState.mTintMode); } } else { if (tint == null) { mTintFilter = null; } } invalidateSelf(); } /** * Specifies the blending mode used to apply tint. * * @param tintMode A Porter-Duff blending mode */ public void setTintMode(Mode tintMode) { mBitmapState.mTintMode = tintMode; if (mTintFilter != null) { mTintFilter.setMode(tintMode); } invalidateSelf(); } /** * @hide Candidate for future API inclusion */ Loading @@ -557,12 +618,35 @@ public class BitmapDrawable extends Drawable { return this; } @Override protected boolean onStateChange(int[] stateSet) { final ColorStateList tint = mBitmapState.mTint; if (tint != null) { final int newColor = tint.getColorForState(stateSet, 0); final int oldColor = mTintFilter.getColor(); if (oldColor != newColor) { mTintFilter.setColor(newColor); invalidateSelf(); return true; } } return false; } @Override public boolean isStateful() { final BitmapState s = mBitmapState; return super.isStateful() || (s.mTint != null && s.mTint.isStateful()); } @Override public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) throws XmlPullParserException, IOException { super.inflate(r, parser, attrs); TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.BitmapDrawable); final BitmapState state = mBitmapState; final TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.BitmapDrawable); final int id = a.getResourceId(com.android.internal.R.styleable.BitmapDrawable_src, 0); if (id == 0) { Loading @@ -574,7 +658,7 @@ public class BitmapDrawable extends Drawable { throw new XmlPullParserException(parser.getPositionDescription() + ": <bitmap> requires a valid src attribute"); } mBitmapState.mBitmap = bitmap; state.mBitmap = bitmap; setBitmap(bitmap); setTargetDensity(r.getDisplayMetrics()); setMipMap(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_mipMap, Loading @@ -582,19 +666,16 @@ public class BitmapDrawable extends Drawable { setAutoMirrored(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_autoMirrored, false)); if (a.hasValue(com.android.internal.R.styleable.BitmapDrawable_colorFilterColor)) { final int colorFilterColor = a.getColor( com.android.internal.R.styleable.BitmapDrawable_colorFilterColor, 0); final int modeValue = a.getInt( com.android.internal.R.styleable.BitmapDrawable_colorFilterMode, Mode.MULTIPLY.ordinal()); final Mode mode = Drawable.parseColorFilterMode(modeValue); if (mode != null) { setColorFilter(colorFilterColor, mode); } final int tintModeValue = a.getInt( com.android.internal.R.styleable.BitmapDrawable_tintMode, -1); state.mTintMode = Drawable.parseTintMode(tintModeValue, Mode.SRC_IN); state.mTint = a.getColorStateList(com.android.internal.R.styleable.BitmapDrawable_tint); if (state.mTint != null) { final int color = state.mTint.getColorForState(getState(), 0); mTintFilter = new PorterDuffColorFilter(color, mBitmapState.mTintMode); } final Paint paint = mBitmapState.mPaint; final Paint paint = state.mPaint; paint.setAntiAlias(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_antialias, paint.isAntiAlias())); paint.setFilterBitmap(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_filter, Loading Loading @@ -648,6 +729,8 @@ public class BitmapDrawable extends Drawable { final static class BitmapState extends ConstantState { Bitmap mBitmap; ColorStateList mTint; Mode mTintMode; int mChangingConfigurations; int mGravity = Gravity.FILL; Paint mPaint = new Paint(DEFAULT_PAINT_FLAGS); Loading @@ -663,6 +746,8 @@ public class BitmapDrawable extends Drawable { BitmapState(BitmapState bitmapState) { mBitmap = bitmapState.mBitmap; mTint = bitmapState.mTint; mTintMode = bitmapState.mTintMode; mChangingConfigurations = bitmapState.mChangingConfigurations; mGravity = bitmapState.mGravity; mTileModeX = bitmapState.mTileModeX; Loading Loading @@ -696,11 +781,18 @@ public class BitmapDrawable extends Drawable { private BitmapDrawable(BitmapState state, Resources res) { mBitmapState = state; if (res != null) { mTargetDensity = res.getDisplayMetrics().densityDpi; } else { mTargetDensity = state.mTargetDensity; } if (state.mTint != null) { final int color = state.mTint.getColorForState(getState(), 0); mTintFilter = new PorterDuffColorFilter(color, state.mTintMode); } setBitmap(state != null ? state.mBitmap : null); } } graphics/java/android/graphics/drawable/Drawable.java +14 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.graphics.drawable; import android.graphics.Insets; import android.graphics.Xfermode; import android.os.Trace; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading @@ -34,6 +35,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Region; import android.graphics.PorterDuff.Mode; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.StateSet; Loading Loading @@ -1137,15 +1139,21 @@ public abstract class Drawable { } /** * Parses a {@link android.graphics.PorterDuff.Mode} from a colorFilterMode * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode * attribute's enum value. */ static PorterDuff.Mode parseColorFilterMode(int value) { final PorterDuff.Mode[] modes = PorterDuff.Mode.values(); if (value >= 0 && value < modes.length) { return modes[value]; } return null; static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) { switch (value) { case 0: return Mode.SRC_IN; case 1: return Mode.SRC_ATOP; case 2: return Mode.MULTIPLY; case 3: return Mode.SCREEN; } return defaultMode; } } Loading
api/current.txt +15 −13 Original line number Diff line number Diff line Loading @@ -345,7 +345,7 @@ package android { field public static final int canRetrieveWindowContent = 16843653; // 0x1010385 field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230 field public static final deprecated int capitalize = 16843113; // 0x1010169 field public static final int castsShadow = 16843778; // 0x1010402 field public static final int castsShadow = 16843777; // 0x1010401 field public static final int category = 16843752; // 0x10103e8 field public static final int centerBright = 16842956; // 0x10100cc field public static final int centerColor = 16843275; // 0x101020b Loading Loading @@ -379,8 +379,6 @@ package android { field public static final int colorActivatedHighlight = 16843664; // 0x1010390 field public static final int colorBackground = 16842801; // 0x1010031 field public static final int colorBackgroundCacheHint = 16843435; // 0x10102ab field public static final int colorFilterColor = 16843767; // 0x10103f7 field public static final int colorFilterMode = 16843768; // 0x10103f8 field public static final int colorFocusedHighlight = 16843663; // 0x101038f field public static final int colorForeground = 16842800; // 0x1010030 field public static final int colorForegroundInverse = 16843270; // 0x1010206 Loading @@ -401,10 +399,10 @@ package android { field public static final int content = 16843355; // 0x101025b field public static final int contentAuthority = 16843408; // 0x1010290 field public static final int contentDescription = 16843379; // 0x1010273 field public static final int controlX1 = 16843770; // 0x10103fa field public static final int controlX2 = 16843772; // 0x10103fc field public static final int controlY1 = 16843771; // 0x10103fb field public static final int controlY2 = 16843773; // 0x10103fd field public static final int controlX1 = 16843769; // 0x10103f9 field public static final int controlX2 = 16843771; // 0x10103fb field public static final int controlY1 = 16843770; // 0x10103fa field public static final int controlY2 = 16843772; // 0x10103fc field public static final int cropToPadding = 16843043; // 0x1010123 field public static final int cursorVisible = 16843090; // 0x1010152 field public static final int customNavigationLayout = 16843474; // 0x10102d2 Loading Loading @@ -544,7 +542,7 @@ package android { field public static final int fromAlpha = 16843210; // 0x10101ca field public static final int fromDegrees = 16843187; // 0x10101b3 field public static final int fromScene = 16843741; // 0x10103dd field public static final int fromSceneName = 16843774; // 0x10103fe field public static final int fromSceneName = 16843773; // 0x10103fd field public static final int fromXDelta = 16843206; // 0x10101c6 field public static final int fromXScale = 16843202; // 0x10101c2 field public static final int fromYDelta = 16843208; // 0x10101c8 Loading Loading @@ -639,7 +637,7 @@ package android { field public static final int isScrollContainer = 16843342; // 0x101024e field public static final int isSticky = 16843335; // 0x1010247 field public static final int isolatedProcess = 16843689; // 0x10103a9 field public static final int isolatedZVolume = 16843769; // 0x10103f9 field public static final int isolatedZVolume = 16843768; // 0x10103f8 field public static final int itemBackground = 16843056; // 0x1010130 field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131 field public static final int itemPadding = 16843565; // 0x101032d Loading Loading @@ -962,7 +960,7 @@ package android { field public static final int shadowRadius = 16843108; // 0x1010164 field public static final int shape = 16843162; // 0x101019a field public static final int shareInterpolator = 16843195; // 0x10101bb field public static final int sharedElementName = 16843776; // 0x1010400 field public static final int sharedElementName = 16843775; // 0x10103ff field public static final int sharedUserId = 16842763; // 0x101000b field public static final int sharedUserLabel = 16843361; // 0x1010261 field public static final int shouldDisableView = 16843246; // 0x10101ee Loading Loading @@ -1139,13 +1137,14 @@ package android { field public static final int tileMode = 16843265; // 0x1010201 field public static final int timeZone = 16843724; // 0x10103cc field public static final int tint = 16843041; // 0x1010121 field public static final int tintMode = 16843767; // 0x10103f7 field public static final int title = 16843233; // 0x10101e1 field public static final int titleCondensed = 16843234; // 0x10101e2 field public static final int titleTextStyle = 16843512; // 0x10102f8 field public static final int toAlpha = 16843211; // 0x10101cb field public static final int toDegrees = 16843188; // 0x10101b4 field public static final int toScene = 16843742; // 0x10103de field public static final int toSceneName = 16843775; // 0x10103ff field public static final int toSceneName = 16843774; // 0x10103fe field public static final int toXDelta = 16843207; // 0x10101c7 field public static final int toXScale = 16843203; // 0x10101c3 field public static final int toYDelta = 16843209; // 0x10101c9 Loading @@ -1161,7 +1160,7 @@ package android { field public static final int transformPivotX = 16843552; // 0x1010320 field public static final int transformPivotY = 16843553; // 0x1010321 field public static final int transition = 16843743; // 0x10103df field public static final int transitionGroup = 16843777; // 0x1010401 field public static final int transitionGroup = 16843776; // 0x1010400 field public static final int transitionOrdering = 16843744; // 0x10103e0 field public static final int translationX = 16843554; // 0x1010322 field public static final int translationY = 16843555; // 0x1010323 Loading Loading @@ -10410,6 +10409,8 @@ package android.graphics.drawable { method public void setTileModeX(android.graphics.Shader.TileMode); method public void setTileModeXY(android.graphics.Shader.TileMode, android.graphics.Shader.TileMode); method public final void setTileModeY(android.graphics.Shader.TileMode); method public void setTint(android.content.res.ColorStateList); method public void setTintMode(android.graphics.PorterDuff.Mode); } public class ClipDrawable extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback { Loading Loading @@ -10551,7 +10552,6 @@ package android.graphics.drawable { method public float getGradientRadius(); method public int getOpacity(); method public android.graphics.drawable.GradientDrawable.Orientation getOrientation(); method public boolean onStateChange(int[]); method public void setAlpha(int); method public void setColor(int); method public void setColor(android.content.res.ColorStateList); Loading Loading @@ -10646,6 +10646,8 @@ package android.graphics.drawable { method public void setTargetDensity(android.graphics.Canvas); method public void setTargetDensity(android.util.DisplayMetrics); method public void setTargetDensity(int); method public void setTint(android.content.res.ColorStateList); method public void setTintMode(android.graphics.PorterDuff.Mode); } public class PaintDrawable extends android.graphics.drawable.ShapeDrawable {
core/res/res/values/attrs.xml +21 −17 Original line number Diff line number Diff line Loading @@ -4094,19 +4094,6 @@ RTL (right-to-left). See {@link android.graphics.drawable.Drawable#setAutoMirrored}. --> <attr name="autoMirrored" format="boolean" /> <!-- If set, specifies the color to apply to the drawable as a color filter. By default, no color filter is applied. --> <attr name="colorFilterColor" format="color" /> <!-- When a color filter color is set, specifies its Porter-Duff blending mode. The default value is multiply. --> <attr name="colorFilterMode"> <!-- [Sa * Da, Sc * Dc] --> <enum name="multiply" value="14" /> <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] --> <enum name="screen" value="15" /> <!-- [Da, Sc * Da + (1 - Sa) * Dc] --> <enum name="src_atop" value="9" /> </attr> </declare-styleable> <!-- Drawable used to render several states. Each state is represented by Loading Loading @@ -4391,8 +4378,21 @@ <!-- Indicates if the drawable needs to be mirrored when its layout direction is RTL (right-to-left). --> <attr name="autoMirrored" /> <attr name="colorFilterColor" /> <attr name="colorFilterMode" /> <!-- If set, specifies the color to apply to the drawable as a tint. By default, no tint is applied. May be a color state list. --> <attr name="tint" /> <!-- When a tint color is set, specifies its Porter-Duff blending mode. The default value is src_in, which treats the drawable as an alpha mask. --> <attr name="tintMode"> <!-- [Sa * Da, Sc * Da] --> <enum name="src_in" value="0" /> <!-- [Da, Sc * Da + (1 - Sa) * Dc] --> <enum name="src_atop" value="1" /> <!-- [Sa * Da, Sc * Dc] --> <enum name="multiply" value="2" /> <!-- [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] --> <enum name="screen" value="3" /> </attr> </declare-styleable> <!-- Drawable used to draw 9-patches. --> Loading @@ -4406,8 +4406,12 @@ <!-- Indicates if the drawable needs to be mirrored when its layout direction is RTL (right-to-left). --> <attr name="autoMirrored" /> <attr name="colorFilterColor" /> <attr name="colorFilterMode" /> <!-- If set, specifies the color to apply to the drawable as a tint. By default, no tint is applied. May be a color state list. --> <attr name="tint" /> <!-- When a tint color is set, specifies its Porter-Duff blending mode. The default value is src_in, which treats the drawable as an alpha mask. --> <attr name="tintMode" /> </declare-styleable> <!-- Drawable used to draw a single color. --> Loading
core/res/res/values/public.xml +1 −2 Original line number Diff line number Diff line Loading @@ -2097,8 +2097,7 @@ <public type="attr" name="windowContentTransitions" /> <public type="attr" name="windowContentTransitionManager" /> <public type="attr" name="translationZ" /> <public type="attr" name="colorFilterColor" /> <public type="attr" name="colorFilterMode" /> <public type="attr" name="tintMode" /> <public type="attr" name="isolatedZVolume" /> <public type="attr" name="controlX1" /> <public type="attr" name="controlY1" /> Loading
graphics/java/android/graphics/drawable/BitmapDrawable.java +177 −85 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.graphics.drawable; import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; Loading @@ -28,6 +29,8 @@ import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.GradientDrawable.GradientState; import android.graphics.Rect; import android.graphics.Shader; import android.graphics.Xfermode; Loading Loading @@ -68,6 +71,7 @@ public class BitmapDrawable extends Drawable { Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG; private BitmapState mBitmapState; private Bitmap mBitmap; private PorterDuffColorFilter mTintFilter; private int mTargetDensity; private final Rect mDstRect = new Rect(); // Gravity.apply() sets this Loading Loading @@ -457,25 +461,37 @@ public class BitmapDrawable extends Drawable { @Override public void draw(Canvas canvas) { Bitmap bitmap = mBitmap; if (bitmap != null) { final Bitmap bitmap = mBitmap; if (bitmap == null) { return; } final BitmapState state = mBitmapState; final Paint paint = state.mPaint; if (state.mRebuildShader) { Shader.TileMode tmx = state.mTileModeX; Shader.TileMode tmy = state.mTileModeY; final Shader.TileMode tmx = state.mTileModeX; final Shader.TileMode tmy = state.mTileModeY; if (tmx == null && tmy == null) { state.mPaint.setShader(null); paint.setShader(null); } else { state.mPaint.setShader(new BitmapShader(bitmap, paint.setShader(new BitmapShader(bitmap, tmx == null ? Shader.TileMode.CLAMP : tmx, tmy == null ? Shader.TileMode.CLAMP : tmy)); } state.mRebuildShader = false; copyBounds(mDstRect); } Shader shader = state.mPaint.getShader(); final boolean clearColorFilter; if (mTintFilter != null && paint.getColorFilter() == null) { paint.setColorFilter(mTintFilter); clearColorFilter = true; } else { clearColorFilter = false; } final Shader shader = paint.getShader(); final boolean needMirroring = needMirroring(); if (shader == null) { if (mApplyGravity) { Loading @@ -484,13 +500,16 @@ public class BitmapDrawable extends Drawable { getBounds(), mDstRect, layoutDirection); mApplyGravity = false; } if (needMirroring) { canvas.save(); // Mirror the bitmap canvas.translate(mDstRect.right - mDstRect.left, 0); canvas.scale(-1.0f, 1.0f); } canvas.drawBitmap(bitmap, null, mDstRect, state.mPaint); canvas.drawBitmap(bitmap, null, mDstRect, paint); if (needMirroring) { canvas.restore(); } Loading @@ -499,6 +518,7 @@ public class BitmapDrawable extends Drawable { copyBounds(mDstRect); mApplyGravity = false; } if (needMirroring) { // Mirror the bitmap updateMirrorMatrix(mDstRect.right - mDstRect.left); Loading @@ -509,14 +529,18 @@ public class BitmapDrawable extends Drawable { shader.setLocalMatrix(Matrix.IDENTITY_MATRIX); } } canvas.drawRect(mDstRect, state.mPaint); canvas.drawRect(mDstRect, paint); } if (clearColorFilter) { paint.setColorFilter(null); } } @Override public void setAlpha(int alpha) { int oldAlpha = mBitmapState.mPaint.getAlpha(); final int oldAlpha = mBitmapState.mPaint.getAlpha(); if (alpha != oldAlpha) { mBitmapState.mPaint.setAlpha(alpha); invalidateSelf(); Loading @@ -534,6 +558,43 @@ public class BitmapDrawable extends Drawable { invalidateSelf(); } /** * Specifies a tint for this drawable. * <p> * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides * tint. * * @param tint Color state list to use for tinting this drawable, or null to * clear the tint */ public void setTint(ColorStateList tint) { mBitmapState.mTint = tint; if (mTintFilter == null) { if (tint != null) { final int color = tint.getColorForState(getState(), 0); mTintFilter = new PorterDuffColorFilter(color, mBitmapState.mTintMode); } } else { if (tint == null) { mTintFilter = null; } } invalidateSelf(); } /** * Specifies the blending mode used to apply tint. * * @param tintMode A Porter-Duff blending mode */ public void setTintMode(Mode tintMode) { mBitmapState.mTintMode = tintMode; if (mTintFilter != null) { mTintFilter.setMode(tintMode); } invalidateSelf(); } /** * @hide Candidate for future API inclusion */ Loading @@ -557,12 +618,35 @@ public class BitmapDrawable extends Drawable { return this; } @Override protected boolean onStateChange(int[] stateSet) { final ColorStateList tint = mBitmapState.mTint; if (tint != null) { final int newColor = tint.getColorForState(stateSet, 0); final int oldColor = mTintFilter.getColor(); if (oldColor != newColor) { mTintFilter.setColor(newColor); invalidateSelf(); return true; } } return false; } @Override public boolean isStateful() { final BitmapState s = mBitmapState; return super.isStateful() || (s.mTint != null && s.mTint.isStateful()); } @Override public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) throws XmlPullParserException, IOException { super.inflate(r, parser, attrs); TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.BitmapDrawable); final BitmapState state = mBitmapState; final TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.BitmapDrawable); final int id = a.getResourceId(com.android.internal.R.styleable.BitmapDrawable_src, 0); if (id == 0) { Loading @@ -574,7 +658,7 @@ public class BitmapDrawable extends Drawable { throw new XmlPullParserException(parser.getPositionDescription() + ": <bitmap> requires a valid src attribute"); } mBitmapState.mBitmap = bitmap; state.mBitmap = bitmap; setBitmap(bitmap); setTargetDensity(r.getDisplayMetrics()); setMipMap(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_mipMap, Loading @@ -582,19 +666,16 @@ public class BitmapDrawable extends Drawable { setAutoMirrored(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_autoMirrored, false)); if (a.hasValue(com.android.internal.R.styleable.BitmapDrawable_colorFilterColor)) { final int colorFilterColor = a.getColor( com.android.internal.R.styleable.BitmapDrawable_colorFilterColor, 0); final int modeValue = a.getInt( com.android.internal.R.styleable.BitmapDrawable_colorFilterMode, Mode.MULTIPLY.ordinal()); final Mode mode = Drawable.parseColorFilterMode(modeValue); if (mode != null) { setColorFilter(colorFilterColor, mode); } final int tintModeValue = a.getInt( com.android.internal.R.styleable.BitmapDrawable_tintMode, -1); state.mTintMode = Drawable.parseTintMode(tintModeValue, Mode.SRC_IN); state.mTint = a.getColorStateList(com.android.internal.R.styleable.BitmapDrawable_tint); if (state.mTint != null) { final int color = state.mTint.getColorForState(getState(), 0); mTintFilter = new PorterDuffColorFilter(color, mBitmapState.mTintMode); } final Paint paint = mBitmapState.mPaint; final Paint paint = state.mPaint; paint.setAntiAlias(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_antialias, paint.isAntiAlias())); paint.setFilterBitmap(a.getBoolean(com.android.internal.R.styleable.BitmapDrawable_filter, Loading Loading @@ -648,6 +729,8 @@ public class BitmapDrawable extends Drawable { final static class BitmapState extends ConstantState { Bitmap mBitmap; ColorStateList mTint; Mode mTintMode; int mChangingConfigurations; int mGravity = Gravity.FILL; Paint mPaint = new Paint(DEFAULT_PAINT_FLAGS); Loading @@ -663,6 +746,8 @@ public class BitmapDrawable extends Drawable { BitmapState(BitmapState bitmapState) { mBitmap = bitmapState.mBitmap; mTint = bitmapState.mTint; mTintMode = bitmapState.mTintMode; mChangingConfigurations = bitmapState.mChangingConfigurations; mGravity = bitmapState.mGravity; mTileModeX = bitmapState.mTileModeX; Loading Loading @@ -696,11 +781,18 @@ public class BitmapDrawable extends Drawable { private BitmapDrawable(BitmapState state, Resources res) { mBitmapState = state; if (res != null) { mTargetDensity = res.getDisplayMetrics().densityDpi; } else { mTargetDensity = state.mTargetDensity; } if (state.mTint != null) { final int color = state.mTint.getColorForState(getState(), 0); mTintFilter = new PorterDuffColorFilter(color, state.mTintMode); } setBitmap(state != null ? state.mBitmap : null); } }
graphics/java/android/graphics/drawable/Drawable.java +14 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.graphics.drawable; import android.graphics.Insets; import android.graphics.Xfermode; import android.os.Trace; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; Loading @@ -34,6 +35,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Region; import android.graphics.PorterDuff.Mode; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.StateSet; Loading Loading @@ -1137,15 +1139,21 @@ public abstract class Drawable { } /** * Parses a {@link android.graphics.PorterDuff.Mode} from a colorFilterMode * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode * attribute's enum value. */ static PorterDuff.Mode parseColorFilterMode(int value) { final PorterDuff.Mode[] modes = PorterDuff.Mode.values(); if (value >= 0 && value < modes.length) { return modes[value]; } return null; static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) { switch (value) { case 0: return Mode.SRC_IN; case 1: return Mode.SRC_ATOP; case 2: return Mode.MULTIPLY; case 3: return Mode.SCREEN; } return defaultMode; } }