package net.osmand.plus.base; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v4.content.res.ResourcesCompat; import net.osmand.plus.R; import java.util.TreeMap; public class FavoriteImageDrawable extends Drawable { private int color; private Paint paintIcon; private Paint paintBackground; private Bitmap favIcon; private Bitmap favBackground; private Resources resources; private boolean withShadow; private Paint paintOuter; private Paint paintInnerCircle; private Drawable listDrawable; public FavoriteImageDrawable(Context ctx, int color, boolean withShadow) { this.withShadow = withShadow; this.resources = ctx.getResources(); this.color = color; paintBackground = new Paint(); int col = color == 0 || color == Color.BLACK ? getResources().getColor(R.color.color_favorite) : color; paintBackground.setColorFilter(new PorterDuffColorFilter(col, PorterDuff.Mode.MULTIPLY)); paintIcon = new Paint(); favIcon = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.map_favorite); favBackground = BitmapFactory.decodeResource(ctx.getResources(), R.drawable.map_white_favorite_shield); listDrawable = ResourcesCompat.getDrawable(getResources(), R.drawable.ic_action_fav_dark, null).mutate(); paintOuter = new Paint(); paintOuter.setAntiAlias(true); paintOuter.setStyle(Style.FILL_AND_STROKE); paintInnerCircle = new Paint(); paintInnerCircle.setStyle(Style.FILL_AND_STROKE); paintOuter.setColor(color == 0 || color == Color.BLACK ? 0x88555555 : color); paintInnerCircle.setColor(color == 0 || color == Color.BLACK ? getResources().getColor(R.color.color_favorite) : color); paintInnerCircle.setAntiAlias(true); } @Override protected void onBoundsChange(Rect bounds) { super.onBoundsChange(bounds); if (!withShadow) { Rect bs = new Rect(bounds); //bs.inset((int) (4 * density), (int) (4 * density)); bs.inset(bs.width() / 4, bs.height() / 4); listDrawable.setBounds(bs); } } @Override public int getIntrinsicHeight() { return favBackground.getHeight(); } @Override public int getIntrinsicWidth() { return favBackground.getWidth(); } public int getColor() { return color; } public Resources getResources() { return resources; } @Override public void draw(Canvas canvas) { Rect bs = getBounds(); if(withShadow) { canvas.drawBitmap(favBackground, bs.exactCenterX() - favBackground.getWidth() / 2f, bs.exactCenterY() - favBackground.getHeight() / 2f, paintBackground); canvas.drawBitmap(favIcon, bs.exactCenterX() - favIcon.getWidth() / 2f, bs.exactCenterY() - favIcon.getHeight() / 2f, paintIcon); } else { int min = Math.min(bs.width(), bs.height()); int r = (min * 4 / 10); int rs = (r - 1); canvas.drawCircle(min / 2, min / 2, r, paintOuter); canvas.drawCircle(min / 2, min / 2, rs, paintInnerCircle); listDrawable.draw(canvas); } } public void drawBitmapInCenter(Canvas canvas, int x, int y) { int dx = x - getIntrinsicWidth() / 2; int dy = y - getIntrinsicHeight() / 2; canvas.translate(dx, dy); draw(canvas); canvas.translate(-dx, -dy); } public void drawBitmapInCenter(Canvas canvas, float x, float y) { float dx = x - getIntrinsicWidth() / 2f; float dy = y - getIntrinsicHeight() / 2f; canvas.translate(dx, dy); draw(canvas); canvas.translate(-dx, -dy); } @Override public int getOpacity() { return 0; } @Override public void setAlpha(int alpha) { paintBackground.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { paintIcon.setColorFilter(cf); } private static TreeMap<Integer, FavoriteImageDrawable> cache = new TreeMap<>(); public static FavoriteImageDrawable getOrCreate(Context a, int color, boolean withShadow) { color = color | 0xff000000; int hash = (color << 2) + (withShadow ? 1 : 0); FavoriteImageDrawable drawable = cache.get(hash); if (drawable == null) { drawable = new FavoriteImageDrawable(a, color, withShadow); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); cache.put(hash, drawable); } return drawable; } }