package com.kostmo.tools.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.Join;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class SwatchView extends View {
public static final String TAG = "SwatchView";
static final int defaultWidth = 32;
static final int defaultHeight = 32;
int color;
Paint paint = new Paint();
boolean grow_to_fit = false;
// ========================================================================
public SwatchView(Context context) {
super(context);
init();
}
public SwatchView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SwatchView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
/**
* @see android.view.View#measure(int, int)
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int max_width = MeasureSpec.getSize(widthMeasureSpec);
int max_height = MeasureSpec.getSize(heightMeasureSpec);
Log.d(TAG, "Swatch measured size: (" + max_width + "x" + max_height + ")");
int size = grow_to_fit ? Math.max(max_width, max_height) : Math.min(max_width, max_height);
setMeasuredDimension(size, size);
}
// ========================================================================
void init() {
this.paint.setAntiAlias(true);
this.paint.setStrokeJoin(Join.ROUND);
}
// ========================================================================
public void setGrow(boolean grow) {
this.grow_to_fit = grow;
}
// ========================================================================
public void setColor(int color) {
this.color = color;
}
// ========================================================================
@Override
protected void onDraw(Canvas canvas) {
int size = Math.min(getWidth(), getHeight());
float stroke_width = size/8f;
this.paint.setStrokeWidth(stroke_width);
RectF rect = new RectF();
float inset_distatnce = -(size - stroke_width)/2;
rect.inset(inset_distatnce, inset_distatnce);
this.paint.setColor(this.color);
this.paint.setStyle(Style.FILL);
drawCenteredRect(canvas, rect, this.paint);
this.paint.setColor(Color.BLACK);
this.paint.setStyle(Style.STROKE);
canvas.save();
canvas.clipRect(0, 0, getWidth()/2, getHeight());
drawCenteredRect(canvas, rect, this.paint);
canvas.restore();
canvas.clipRect(getWidth()/2, 0, getWidth(), getHeight());
this.paint.setColor(Color.WHITE);
drawCenteredRect(canvas, rect, this.paint);
}
// ========================================================================
void drawCenteredRect(Canvas canvas, RectF rect, Paint paint) {
canvas.save();
canvas.translate(getWidth()/2, getHeight()/2);
float r = paint.getStrokeWidth()*2;
canvas.drawRoundRect(rect, r, r, this.paint);
canvas.restore();
}
}
|