package oak.widget;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import oak.R;
public class MaskedImageView extends ImageView {
private BitmapDrawable maskDrawable;
private NinePatchDrawable maskDrawableNine;
private BitmapDrawable overlayDrawable;
private NinePatchDrawable overlayDrawableNine;
private int mFillColor;
private int shadowColor;
public MaskedImageView(Context context) {
super(context);
}
public MaskedImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MaskedImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
Resources res = getResources();
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MaskedImageView);
if (typedArray != null && res != null) {
int fillColorResourceId = typedArray.getResourceId(R.styleable.MaskedImageView_oakFillColor, -1);
int glareColorResourceId = typedArray.getResourceId(R.styleable.MaskedImageView_oakGlareColor, -1);
int maskResourceId = typedArray.getResourceId(R.styleable.MaskedImageView_oakMask, -1);
int overlayResourceId = typedArray.getResourceId(R.styleable.MaskedImageView_oakOverlay, -1);
if (fillColorResourceId != -1) {
setFillColor(res.getColor(fillColorResourceId));
}
if (glareColorResourceId != -1) {
setGlareColor(res.getColor(glareColorResourceId));
}
if (maskResourceId != -1) {
Drawable d = res.getDrawable(maskResourceId);
if (d != null && d instanceof BitmapDrawable) {
setMaskDrawable((BitmapDrawable) d);
} else if (d != null && d instanceof NinePatchDrawable) {
setMaskDrawable((NinePatchDrawable) d);
}
}
if (overlayResourceId != -1) {
Drawable d = res.getDrawable(overlayResourceId);
if (d != null && d instanceof BitmapDrawable) {
setOverlayDrawable((BitmapDrawable) d);
} else if (d != null && d instanceof NinePatchDrawable) {
setOverlayDrawable((NinePatchDrawable) d);
}
}
typedArray.recycle();
}
}
public void setFillColor(int color) {
mFillColor = color;
}
private void setGlareColor(int color) {
shadowColor = color;
}
@Override
protected void onDraw(Canvas canvas) {
BitmapDrawable bmDrawable = (BitmapDrawable) getDrawable();
Rect rect = new Rect();
getDrawingRect(rect);
Bitmap product = Bitmap.createBitmap(rect.width(), rect.height(), Bitmap.Config.ARGB_8888);
if (bmDrawable != null && bmDrawable.getBitmap() != null) {
product.setDensity(bmDrawable.getBitmap().getDensity());
Canvas c = new Canvas(product);
c.setDensity(canvas.getDensity());
c.drawColor(mFillColor);
super.onDraw(c);
if (maskDrawable != null) {
Paint p = new Paint();
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
c.drawBitmap(maskDrawable.getBitmap(), null, rect, p);
} else if (maskDrawableNine != null) {
maskDrawableNine.setBounds(rect);
maskDrawableNine.getPaint().setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
maskDrawableNine.draw(c);
}
if (shadowColor != 0) {
//draw glare
Paint glarePaint = new Paint();
glarePaint.setColor(shadowColor);
glarePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Path glarePath = new Path();
glarePath.moveTo(rect.centerX() - rect.width() / 2, rect.centerY() - rect.height() / 2);
glarePath.lineTo(rect.centerX() - rect.width() / 2, rect.centerY() + rect.height() / 2 - rect.height() / 5);
glarePath.lineTo(rect.centerX() + rect.width() / 2, rect.centerY() - rect.height() / 2 + rect.height() / 5);
glarePath.lineTo(rect.centerX() + rect.width() / 2, rect.centerY() - rect.height() / 2);
c.drawPath(glarePath, glarePaint);
}
if (overlayDrawable != null) {
Paint p = new Paint();
c.drawBitmap(overlayDrawable.getBitmap(), null, rect, p);
} else if (overlayDrawableNine != null) {
overlayDrawableNine.setBounds(rect);
overlayDrawableNine.draw(c);
}
canvas.drawBitmap(product, null, rect, new Paint());
}
product.recycle();
}
public void setMaskDrawable(BitmapDrawable bmDrawable) {
this.maskDrawable = bmDrawable;
}
public void setMaskDrawable(NinePatchDrawable bmDrawable) {
this.maskDrawableNine = bmDrawable;
}
public void setOverlayDrawable(BitmapDrawable bmDrawable) {
this.overlayDrawable = bmDrawable;
}
public void setOverlayDrawable(NinePatchDrawable npDrawable) {
this.overlayDrawableNine = npDrawable;
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
}
@Override
public void requestLayout() {
// do nothing -- the layout changes so this optimizes things a bit
}
}