diff options
Diffstat (limited to 'graphics/java')
3 files changed, 93 insertions, 5 deletions
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index cf72f3887815..42e28e8a1aa3 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -739,6 +739,8 @@ public abstract class Drawable { if (r != null) { ((BitmapDrawable) drawable).setDensityScale(r.getDisplayMetrics()); } + } else if (name.equals("nine-patch")) { + drawable = new NinePatchDrawable(); } else { throw new XmlPullParserException(parser.getPositionDescription() + ": invalid drawable tag " + name); diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 3ded37b8a80e..dace96c9c891 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -17,6 +17,15 @@ package android.graphics.drawable; import android.graphics.*; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.TypedValue; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; +import java.io.InputStream; /** * @@ -32,6 +41,9 @@ public class NinePatchDrawable extends Drawable { private Paint mPaint; private boolean mMutated; + NinePatchDrawable() { + } + public NinePatchDrawable(Bitmap bitmap, byte[] chunk, Rect padding, String srcName) { this(new NinePatchState(new NinePatch(bitmap, chunk, srcName), padding)); } @@ -40,6 +52,13 @@ public class NinePatchDrawable extends Drawable { this(new NinePatchState(patch, null)); } + private void setNinePatchState(NinePatchState state) { + mNinePatchState = state; + mNinePatch = state.mNinePatch; + mPadding = state.mPadding; + if (state.mDither) setDither(state.mDither); + } + // overrides @Override @@ -73,6 +92,55 @@ public class NinePatchDrawable extends Drawable { getPaint().setDither(dither); } + @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.NinePatchDrawable); + + final int id = a.getResourceId(com.android.internal.R.styleable.NinePatchDrawable_src, 0); + if (id == 0) { + throw new XmlPullParserException(parser.getPositionDescription() + + ": <nine-patch> requires a valid src attribute"); + } + + final boolean dither = a.getBoolean( + com.android.internal.R.styleable.NinePatchDrawable_dither, false); + final BitmapFactory.Options options = new BitmapFactory.Options(); + if (dither) { + options.inDither = false; + } + + final Rect padding = new Rect(); + Bitmap bitmap = null; + + try { + final TypedValue value = new TypedValue(); + final InputStream is = r.openRawResource(id, value); + + bitmap = BitmapFactory.decodeStream(r, value, is, padding, options); + + is.close(); + } catch (IOException e) { + // Ignore + } + + if (bitmap == null) { + throw new XmlPullParserException(parser.getPositionDescription() + + ": <nine-patch> requires a valid src attribute"); + } else if (bitmap.getNinePatchChunk() == null) { + throw new XmlPullParserException(parser.getPositionDescription() + + ": <nine-patch> requires a valid 9-patch source image"); + } + + setNinePatchState(new NinePatchState( + new NinePatch(bitmap, bitmap.getNinePatchChunk(), "XML 9-patch"), padding, dither)); + + a.recycle(); + } + + public Paint getPaint() { if (mPaint == null) { mPaint = new Paint(); @@ -141,17 +209,24 @@ public class NinePatchDrawable extends Drawable { final static class NinePatchState extends ConstantState { final NinePatch mNinePatch; final Rect mPadding; + final boolean mDither; int mChangingConfigurations; NinePatchState(NinePatch ninePatch, Rect padding) { + this(ninePatch, padding, false); + } + + NinePatchState(NinePatch ninePatch, Rect rect, boolean dither) { mNinePatch = ninePatch; - mPadding = padding; + mPadding = rect; + mDither = dither; } NinePatchState(NinePatchState state) { mNinePatch = new NinePatch(state.mNinePatch); mPadding = new Rect(state.mPadding); mChangingConfigurations = state.mChangingConfigurations; + mDither = state.mDither; } @Override @@ -166,9 +241,7 @@ public class NinePatchDrawable extends Drawable { } private NinePatchDrawable(NinePatchState state) { - mNinePatchState = state; - mNinePatch = state.mNinePatch; - mPadding = state.mPadding; + setNinePatchState(state); } } diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java index 475825c28a9a..d22a4baaee69 100644 --- a/graphics/java/android/graphics/drawable/StateListDrawable.java +++ b/graphics/java/android/graphics/drawable/StateListDrawable.java @@ -203,7 +203,20 @@ public class StateListDrawable extends DrawableContainer { public Drawable getStateDrawable(int index) { return mStateListState.getChildren()[index]; } - + + /** + * Gets the index of the drawable with the provided state set. + * + * @param stateSet the state set to look up + * @return the index of the provided state set, or -1 if not found + * @hide pending API council + * @see #getStateDrawable(int) + * @see #getStateSet(int) + */ + public int getStateDrawableIndex(int[] stateSet) { + return mStateListState.indexOfStateSet(stateSet); + } + @Override public Drawable mutate() { if (!mMutated && super.mutate() == this) { |