@Implementation // todo: this sucks, it's all just so we can detect 9-patches protected static Drawable createFromResourceStream( Resources res, TypedValue value, InputStream is, String srcName, BitmapFactory.Options opts) { if (is == null) { return null; } Rect pad = new Rect(); if (opts == null) opts = new BitmapFactory.Options(); opts.inScreenDensity = DisplayMetrics.DENSITY_DEFAULT; Bitmap bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts); if (bm != null) { boolean isNinePatch = srcName != null && srcName.contains(".9."); if (isNinePatch) { ReflectionHelpers.callInstanceMethod(bm, "setNinePatchChunk", ClassParameter.from(byte[].class, new byte[0])); } byte[] np = bm.getNinePatchChunk(); if (np == null || !NinePatch.isNinePatchChunk(np)) { np = null; pad = null; } if (np != null) { // todo: wrong return new NinePatchDrawable(res, bm, np, pad, srcName); } return new BitmapDrawable(res, bm); } return null; }
private Bitmap createDraggingItemImage(View v, NinePatchDrawable shadow) { int viewTop = v.getTop(); int viewLeft = v.getLeft(); int viewWidth = v.getWidth(); int viewHeight = v.getHeight(); int canvasWidth = viewWidth + mShadowPadding.left + mShadowPadding.right; int canvasHeight = viewHeight + mShadowPadding.top + mShadowPadding.bottom; v.measure( View.MeasureSpec.makeMeasureSpec(viewWidth, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(viewHeight, View.MeasureSpec.EXACTLY)); v.layout(viewLeft, viewTop, viewLeft + viewWidth, viewTop + viewHeight); final Bitmap bitmap = Bitmap.createBitmap(canvasWidth, canvasHeight, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); if (shadow != null) { shadow.setBounds(0, 0, canvasWidth, canvasHeight); shadow.draw(canvas); } final int savedCount = canvas.save(); // NOTE: Explicitly set clipping rect. This is required on Gingerbread. canvas.clipRect(mShadowPadding.left, mShadowPadding.top, canvasWidth - mShadowPadding.right, canvasHeight - mShadowPadding.bottom); canvas.translate(mShadowPadding.left, mShadowPadding.top); v.draw(canvas); canvas.restoreToCount(savedCount); return bitmap; }
public void setShadowDrawable(NinePatchDrawable shadowDrawable) { mShadowDrawable = shadowDrawable; if (mShadowDrawable != null) { mShadowDrawable.getPadding(mShadowPadding); } }
ImageView imageView = (ImageView) findViewById(R.id.mimage); NinePatchDrawable mask = (NinePatchDrawable) getResources().getDrawable(R.drawable.balloon); Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.pomba); Bitmap result = Bitmap.createBitmap(original.getWidth(), original.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); canvas.drawBitmap(original, 0, 0, null); mask.getPaint().setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mask.setBounds(new Rect(0, 0, original.getWidth(), original.getHeight())); mask.draw(canvas); imageView.setImageBitmap(result);
@Override public void draw(@NonNull Canvas canvas) { if (mShadow != null) { mShadow.draw(canvas); } super.draw(canvas); } }
private void updateNinePatchBounds(NinePatchDrawable ninePatch, int childLeft, int childTop, int childRight, int childBottom) { if (ninePatch == null) { return; } final Rect t = mTempRect; ninePatch.getPadding(t); ninePatch.setBounds( childLeft - t.left, childTop - t.top, childRight + t.right, childBottom + t.bottom); }
private void updateShadowBounds() { NinePatchDrawable shadow = mShadow; if (shadow == null) { return; } int width = getWidth(); int height = getHeight(); Rect paddings = mShadowPaddings; if (width != 0 && height != 0) { shadow.setBounds(-paddings.left, -paddings.top, width + paddings.right, height + paddings.bottom); } }
@Override public void draw(Canvas canvas) { super.draw(canvas); if (mShadowDrawable != null && mShadowVisible) { if (mShadowNinePatchDrawable != null) { mShadowNinePatchDrawable.getPaint().setAlpha((int) (255 * mAlpha)); } mShadowDrawable.draw(canvas); } }
static Drawable tint9PatchDrawableFrame(@NonNull Context context, @ColorInt int tintColor) { final NinePatchDrawable toastDrawable = (NinePatchDrawable) getDrawable(context, R.drawable.oklib_toast_frame); toastDrawable.setColorFilter(new PorterDuffColorFilter(tintColor, PorterDuff.Mode.SRC_IN)); return toastDrawable; }
super(context, attrs, defStyleAttr); mMask = (NinePatchDrawable) getResources().getDrawable(R.drawable.mask); mMask.getPaint().setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mMask.setBounds(0, 0, w, h); canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG); super.draw(canvas); mMask.draw(canvas); canvas.restore();
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if ((getChildCount() > 0) && (getChildAt(0).getVisibility() == View.VISIBLE)) { if (mUseAmbientShadow) { if (mCurrentAmbientShadowDrawable1 != null) { mCurrentAmbientShadowDrawable1.draw(canvas); } if (mCurrentAmbientShadowDrawable2 != null) { mCurrentAmbientShadowDrawable2.draw(canvas); } } if (mUseSpotShadow && (mCurrentSpotShadowDrawable1 != null || mCurrentSpotShadowDrawable2 != null)) { final int savedCount = canvas.save(); canvas.translate(mSpotShadowTranslationX, mSpotShadowTranslationY); if (mCurrentSpotShadowDrawable1 != null) { mCurrentSpotShadowDrawable1.draw(canvas); } if (mCurrentSpotShadowDrawable2 != null) { mCurrentSpotShadowDrawable2.draw(canvas); } canvas.restoreToCount(savedCount); } } }
@Override public void draw(Canvas canvas) { super.draw(canvas); if (mShadowDrawable != null && mShadowVisible) { if (mShadowNinePatchDrawable != null) { mShadowNinePatchDrawable.getPaint().setAlpha((int) (255 * mAlpha)); } mShadowDrawable.draw(canvas); } }
/*** * Method called from APIs below 21 to setup Progress Color */ private void setupProgressColor() { try { //load up the drawable and apply color LayerDrawable ld = (LayerDrawable) getProgressDrawable(); ScaleDrawable shape = (ScaleDrawable) (ld.findDrawableByLayerId(android.R.id.progress)); shape.setColorFilter(mProgressColor, PorterDuff.Mode.SRC_IN); //set the background to transparent NinePatchDrawable ninePatchDrawable = (NinePatchDrawable) (ld.findDrawableByLayerId(android.R.id.background)); ninePatchDrawable.setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN); } catch (NullPointerException e) { //TODO: Handle exception } }
@Override public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { final int childCount = parent.getChildCount(); if (childCount == 0) { return; } for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); if (!shouldDrawDropShadow(child)) { continue; } final int tx = (int) (child.getTranslationX() + 0.5f); final int ty = (int) (child.getTranslationY() + 0.5f); final int left = child.getLeft() - mShadowPadding.left; final int right = child.getRight() + mShadowPadding.right; final int top = child.getTop() - mShadowPadding.top; final int bottom = child.getBottom() + mShadowPadding.bottom; mShadowDrawable.setBounds(left + tx, top + ty, right + tx, bottom + ty); mShadowDrawable.draw(c); } }
public static NinePatchDrawable createNinePatchWithCapInsets(Resources res, Bitmap bitmap, List<Range> rangeListX, List<Range> rangeListY, String srcName) { ByteBuffer buffer = getByteBuffer(rangeListX, rangeListY); NinePatchDrawable drawable = new NinePatchDrawable(res, bitmap, buffer.array(), new Rect(), srcName); return drawable; }
@Override public void draw(Canvas canvas) { super.draw(canvas); if (TextUtils.isEmpty(mStr)) { return; } float textHeight = mPaint.descent() - mPaint.ascent(); float textWidth = mPaint.measureText(mStr); float offsetX = textWidth / 2; float offsetY = textHeight / 2; float disY = getIntrinsicHeight() / 2 - offsetY; float disX = getIntrinsicWidth() / 2 - offsetX; canvas.drawText(mStr, this.getBounds().right - getIntrinsicWidth() + disX, this.getBounds().bottom - getIntrinsicHeight() + textHeight, mPaint); } }
/** * Constructor. * * @param shadow 9-patch drawable used for drop shadow * @param castShadowForTransparentBackgroundItem Whether to cast shadows for transparent items */ public ItemShadowDecorator(@NonNull NinePatchDrawable shadow, boolean castShadowForTransparentBackgroundItem) { mShadowDrawable = shadow; mShadowDrawable.getPadding(mShadowPadding); mCastShadowForTransparentBackgroundItem = castShadowForTransparentBackgroundItem; }
ninePatchDrawable.setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN);