package info.guardianproject.pixelknot.views;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.ImageView;
import info.guardianproject.pixelknot.R;
/**
* An ImageView with a color filter applied on top
*/
public class ColorFilterImageView extends ImageView {
private int mFilterStartColor;
private int mFilterEndColor;
private float mFilterCurrent;
public ColorFilterImageView(Context context) {
super(context);
init(context, null);
}
public ColorFilterImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public ColorFilterImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ColorFilterImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
mFilterCurrent = 0;
mFilterStartColor = Color.TRANSPARENT;
mFilterEndColor = Color.TRANSPARENT;
if (attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ColorFilterImageView);
if (a != null) {
mFilterCurrent = a.getFloat(R.styleable.ColorFilterImageView_filterCurrent, 0f);
mFilterStartColor = a.getColor(R.styleable.ColorFilterImageView_filterStartColor, Color.TRANSPARENT);
mFilterEndColor = a.getColor(R.styleable.ColorFilterImageView_filterEndColor, Color.TRANSPARENT);
a.recycle();
}
}
}
public float getFilterCurrent() {
return mFilterCurrent;
}
public void setFilterCurrent(float filterCurrent) {
mFilterCurrent = filterCurrent;
postInvalidate();
}
public int getFilterStartColor() { return mFilterStartColor; }
public void setFilterStartColor(int filterStartColor) {
mFilterStartColor = filterStartColor;
}
public int getFilterEndColor() { return mFilterEndColor; }
public void setFilterEndColor(int filterEndColor) {
mFilterEndColor = filterEndColor;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mFilterStartColor != Color.TRANSPARENT || mFilterEndColor != Color.TRANSPARENT) {
int a = mixColorComponent(Color.alpha(mFilterStartColor), Color.alpha(mFilterEndColor), mFilterCurrent);
int r = mixColorComponent(Color.red(mFilterStartColor), Color.red(mFilterEndColor), mFilterCurrent);
int g = mixColorComponent(Color.green(mFilterStartColor), Color.green(mFilterEndColor), mFilterCurrent);
int b = mixColorComponent(Color.blue(mFilterStartColor), Color.blue(mFilterEndColor), mFilterCurrent);
int color = Color.argb(a, r, g, b);
canvas.drawColor(color);
}
}
private int mixColorComponent(int c1, int c2, float mix) {
float diff = c2 - c1;
return c1 + (int)(mix * diff);
}
}