package view_inspector.probe.util;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Region;
import android.view.View;
import android.view.ViewGroup;
public final class DrawUtil {
private static final int VIEW_COLOR = 0xFF3366FF;
private static final int CONTAINER_COLOR = 0xFF2AFF80;
private static final int MARGIN_COLOR = 0x88FFAAAA;
private static final int PADDING_COLOR = 0x883366FF;
private static final float BORDER_WIDTH_DP = 2.5f;
private static final float BORDER_SIZE_RATIO = 0.2f;
private static final float MAX_BORDER_SIZE_DP = 15;
private static final int NO_OVERMEASURE = 0xFF999999;
private static final int OVERMEASURE_1x = 0xFFAAAAFF;
private static final int OVERMEASURE_2x = 0xFF2AFF80;
private static final int OVERMEASURE_3x = 0xFFFFAAAA;
private static final int OVERMEASURE_4x = 0xFFFF0000;
private static final int TEXT_OFFSET_DP = 2;
private static final int TEXT_SIZE_DP = 10;
public static void drawOutline(Context context, View view, Canvas canvas) {
int width = view.getWidth();
int height = view.getHeight();
final int color;
if (view instanceof ViewGroup) {
color = CONTAINER_COLOR;
} else {
color = VIEW_COLOR;
}
final float density = context.getResources().getDisplayMetrics().density;
float borderWidth = BORDER_WIDTH_DP * density;
float maxBorderSize = MAX_BORDER_SIZE_DP * density;
Paint borderPaint = new Paint();
borderPaint.setStrokeWidth(borderWidth);
borderPaint.setColor(color);
final float lineWidth = Math.min(maxBorderSize, width * BORDER_SIZE_RATIO);
final float lineHeight = Math.min(maxBorderSize, height * BORDER_SIZE_RATIO);
canvas.drawLine(0, 0, lineWidth, 0, borderPaint);
canvas.drawLine(0, 0, 0, lineHeight, borderPaint);
canvas.drawLine(0, height, 0, height - lineHeight, borderPaint);
canvas.drawLine(0, height, lineWidth, height, borderPaint);
canvas.drawLine(width, 0, width, lineHeight, borderPaint);
canvas.drawLine(width, 0, width - lineWidth, 0, borderPaint);
canvas.drawLine(width, height, width, height - lineHeight, borderPaint);
canvas.drawLine(width, height, width - lineWidth, height, borderPaint);
}
public static void drawMargin(View view, Canvas canvas) {
if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
int width = view.getWidth();
int height = view.getHeight();
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
int lMargin = mlp.leftMargin;
int tMargin = mlp.topMargin;
int rMargin = mlp.rightMargin;
int bMargin = mlp.bottomMargin;
// extend canvas
Rect newRect = canvas.getClipBounds();
int dx = -Math.max(mlp.leftMargin, mlp.rightMargin);
int dy = -Math.max(mlp.topMargin, mlp.bottomMargin);
newRect.inset(dx, dy);
canvas.clipRect(newRect, Region.Op.REPLACE);
Rect lRect = new Rect(-lMargin, 0, 0, height);
Rect ltRect = new Rect(-lMargin, -tMargin, 0, 0);
Rect tRect = new Rect(0, -tMargin, width, 0);
Rect trRect = new Rect(width, -tMargin, width + rMargin, 0);
Rect rRect = new Rect(width, 0, width + rMargin, height);
Rect rbRect = new Rect(width, height, width + rMargin, height + bMargin);
Rect bRect = new Rect(0, height, width, height + bMargin);
Rect blRect = new Rect(-lMargin, height, 0, height + bMargin);
Paint paint = new Paint();
paint.setColor(MARGIN_COLOR);
canvas.drawRect(lRect, paint);
canvas.drawRect(ltRect, paint);
canvas.drawRect(tRect, paint);
canvas.drawRect(trRect, paint);
canvas.drawRect(rRect, paint);
canvas.drawRect(rbRect, paint);
canvas.drawRect(bRect, paint);
canvas.drawRect(blRect, paint);
}
}
public static void drawPadding(View view, Canvas canvas) {
int width = view.getWidth();
int height = view.getHeight();
int lPad = view.getPaddingLeft();
int tPad = view.getPaddingTop();
int rPad = view.getPaddingRight();
int bPad = view.getPaddingBottom();
Rect lRect = new Rect(0, 0, lPad, height);
Rect tRect = new Rect(lPad, 0, width - rPad, tPad);
Rect rRect = new Rect(width - rPad, 0, width, height);
Rect bRect = new Rect(lPad, height - bPad, width - rPad, height);
Paint paint = new Paint();
paint.setColor(PADDING_COLOR);
canvas.drawRect(lRect, paint);
canvas.drawRect(tRect, paint);
canvas.drawRect(rRect, paint);
canvas.drawRect(bRect, paint);
}
public static void drawMeasures(View view, Canvas canvas, Integer measureCount) {
final int color;
switch (measureCount) {
case 0:
case 1:
color = NO_OVERMEASURE;
break;
case 2:
color = OVERMEASURE_1x;
break;
case 3:
color = OVERMEASURE_2x;
break;
case 4:
color = OVERMEASURE_3x;
break;
default:
color = OVERMEASURE_4x;
break;
}
if (measureCount > 1) {
final int tintColor =
Color.argb(150, Color.red(color), Color.green(color), Color.blue(color));
Rect rect = new Rect();
view.getDrawingRect(rect);
Paint paint = new Paint();
paint.setColor(tintColor);
canvas.drawRect(rect, paint);
}
}
public static void drawMeasureCount(Context context, View view, Canvas canvas,
Integer measureCount) {
final float density = context.getResources().getDisplayMetrics().density;
final float textSize = TEXT_SIZE_DP * density;
final float textOffset = TEXT_OFFSET_DP * density;
Paint textPaint = new Paint();
textPaint.setColor(0xFF888888);
textPaint.setTextSize(textSize);
textPaint.setShadowLayer(1, -1, 1, 0xFF000000);
String measureStr = "measure: " + measureCount + "x";
canvas.drawText(measureStr, textOffset, view.getHeight() - textOffset, textPaint);
}
private DrawUtil() {
throw new AssertionError("No instances.");
}
}