package im.actor.sdk.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.View;
import im.actor.sdk.R;
public class TintImageView extends View {
private static final long TINT_ANIMATION_TIME = 200;
private Paint PAINT = new Paint();
private Bitmap baseBitmap;
private int currentTintColor = Color.WHITE;
private int startTintColor = Color.WHITE;
private int destTintColor = Color.WHITE;
private long animationStart = 0;
public TintImageView(Context context) {
super(context);
}
public TintImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public TintImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
private void init(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.TintImageView);
setTint(a.getColor(R.styleable.TintImageView_tintColor, Color.WHITE));
int resourceId = a.getResourceId(R.styleable.TintImageView_src, 0);
if (resourceId != 0) {
Drawable drawable = getResources().getDrawable(resourceId);
if (drawable instanceof BitmapDrawable) {
setDrawable(((BitmapDrawable) drawable).getBitmap());
}
}
a.recycle();
}
public void setResource(int resId) {
setDrawable(((BitmapDrawable) getResources().getDrawable(resId)).getBitmap());
}
public void setDrawable(Bitmap bitmap) {
baseBitmap = bitmap;
invalidate();
}
public void setTint(int color) {
this.currentTintColor = color;
this.startTintColor = color;
this.destTintColor = color;
this.animationStart = 0;
invalidate();
}
public void animateTint(int destColor) {
this.startTintColor = currentTintColor;
this.destTintColor = destColor;
this.animationStart = SystemClock.uptimeMillis();
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
long animationTime = SystemClock.uptimeMillis() - animationStart;
if (animationTime > TINT_ANIMATION_TIME) {
currentTintColor = destTintColor;
} else {
float alpha = animationTime / (float) TINT_ANIMATION_TIME;
int sR = Color.red(startTintColor);
int sG = Color.green(startTintColor);
int sB = Color.blue(startTintColor);
int sA = Color.alpha(startTintColor);
int dR = Color.red(destTintColor);
int dG = Color.green(destTintColor);
int dB = Color.blue(destTintColor);
int dA = Color.alpha(destTintColor);
int r = (int) (sR * (1 - alpha) + dR * (alpha));
int g = (int) (sG * (1 - alpha) + dG * (alpha));
int b = (int) (sB * (1 - alpha) + dB * (alpha));
int a = (int) (sA * (1 - alpha) + dA * (alpha));
currentTintColor = Color.argb(a, r, g, b);
invalidate();
}
if (baseBitmap != null) {
PorterDuffColorFilter filter = new PorterDuffColorFilter(currentTintColor, PorterDuff.Mode.SRC_IN);
PAINT.setColorFilter(filter);
int x = (getWidth() - baseBitmap.getWidth()) / 2;
int y = (getHeight() - baseBitmap.getHeight()) / 2;
canvas.drawBitmap(baseBitmap, x, y, PAINT);
}
}
}