package com.gzsll.hupu.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import com.gzsll.hupu.R;
import com.yalantis.phoenix.util.Logger;
public class LabelViewHelper {
private static final int LEFT_TOP = 1;
private static final int RIGHT_TOP = 2;
private static final int LEFT_BOTTOM = 3;
private static final int RIGHT_BOTTOM = 4;
private static final int DEFAULT_DISTANCE = 20;
private static final int DEFAULT_HEIGHT = 20;
private static final int DEFAULT_TEXT_SIZE = 14;
private static final int DEFAULT_BACKGROUND_COLOR = 0xFFED050D;
private static final int DEFAULT_TEXT_COLOR = 0xFFFFFFFF;
private static final int DEFAULT_ORIENTATION = RIGHT_TOP;
private int distance;
private int height;
private String text;
private int backgroundColor;
private int textSize;
private int textColor;
private boolean visual;
private int orientation;
private float startPosX;
private float startPosY;
private float endPosX;
private float endPosY;
private Paint rectPaint;
// simulator
private Path rectPath;
private Paint textPaint;
private Rect textBound;
private Context context;
public LabelViewHelper(Context context, AttributeSet attrs, int defStyleAttr) {
this.context = context;
TypedArray attributes =
context.obtainStyledAttributes(attrs, R.styleable.LabelView, defStyleAttr, 0);
distance = attributes.getDimensionPixelSize(R.styleable.LabelView_label_distance,
dip2Px(DEFAULT_DISTANCE));
height = attributes.getDimensionPixelSize(R.styleable.LabelView_label_height,
dip2Px(DEFAULT_HEIGHT));
text = attributes.getString(R.styleable.LabelView_label_text);
backgroundColor =
attributes.getColor(R.styleable.LabelView_label_backgroundColor, DEFAULT_BACKGROUND_COLOR);
textSize = attributes.getDimensionPixelSize(R.styleable.LabelView_label_textSize,
dip2Px(DEFAULT_TEXT_SIZE));
textColor = attributes.getColor(R.styleable.LabelView_label_textColor, DEFAULT_TEXT_COLOR);
visual = attributes.getBoolean(R.styleable.LabelView_label_visual, false);
orientation =
attributes.getInteger(R.styleable.LabelView_label_orientation, DEFAULT_ORIENTATION);
attributes.recycle();
rectPaint = new Paint();
rectPaint.setDither(true);
rectPaint.setAntiAlias(true);
rectPaint.setStyle(Paint.Style.STROKE);
rectPaint.setStrokeJoin(Paint.Join.ROUND);
rectPaint.setStrokeCap(Paint.Cap.SQUARE);
rectPath = new Path();
rectPath.reset();
textPaint = new Paint();
textPaint.setDither(true);
textPaint.setAntiAlias(true);
textPaint.setStrokeJoin(Paint.Join.ROUND);
textPaint.setStrokeCap(Paint.Cap.SQUARE);
textBound = new Rect();
}
public void onDraw(Canvas canvas, int measuredWidth, int measuredHeight) {
if (!visual) {
return;
}
float actualDistance = distance + height / 2;
calcOffset(actualDistance, measuredWidth, measuredHeight);
rectPaint.setColor(backgroundColor);
rectPaint.setStrokeWidth(height);
rectPath.reset();
rectPath.moveTo(startPosX, startPosY);
rectPath.lineTo(endPosX, endPosY);
canvas.drawPath(rectPath, rectPaint);
textPaint.setTextSize(textSize);
textPaint.setColor(textColor);
textPaint.getTextBounds(text, 0, text.length(), textBound);
canvas.drawTextOnPath(text, rectPath, (1.4142135f * actualDistance) / 2 - textBound.width() / 2,
textBound.height() / 2, textPaint);
}
private void calcOffset(float actualDistance, int measuredWidth, int measuredHeight) {
switch (orientation) {
case 1:
startPosX = 0;
startPosY = actualDistance;
endPosX = actualDistance;
endPosY = 0;
break;
case 2:
startPosX = measuredWidth - actualDistance;
startPosY = 0;
endPosX = measuredWidth;
endPosY = actualDistance;
break;
case 3:
startPosX = 0;
startPosY = measuredHeight - actualDistance;
endPosX = actualDistance;
endPosY = measuredHeight;
break;
case 4:
startPosX = measuredWidth - actualDistance;
startPosY = measuredHeight;
endPosX = measuredWidth;
endPosY = measuredHeight - actualDistance;
break;
}
}
private int dip2Px(float dip) {
return (int) (dip * context.getResources().getDisplayMetrics().density + 0.5f);
}
private int px2Dip(float px) {
return (int) (px / context.getResources().getDisplayMetrics().density + 0.5f);
}
public void setLabelHeight(View view, int height) {
if (this.height != dip2Px(height)) {
this.height = dip2Px(height);
view.invalidate();
}
}
public int getLabelHeight() {
return px2Dip(this.height);
}
public void setLabelDistance(View view, int distance) {
if (this.distance != dip2Px(distance)) {
this.distance = dip2Px(distance);
view.invalidate();
}
}
public int getLabelDistance() {
return px2Dip(this.distance);
}
public boolean isLabelVisual() {
return visual;
}
public void setLabelVisual(View view, boolean visual) {
if (this.visual != visual) {
this.visual = visual;
view.invalidate();
}
}
public int getLabelOrientation() {
return orientation;
}
public void setLabelOrientation(View view, int orientation) {
if (this.orientation != orientation && orientation <= 4 && orientation >= 1) {
this.orientation = orientation;
view.invalidate();
}
}
public int getLabelTextColor() {
return textColor;
}
public void setLabelTextColor(View view, int textColor) {
if (this.textColor != textColor) {
this.textColor = textColor;
view.invalidate();
}
}
public int getLabelBackgroundColor() {
return backgroundColor;
}
public void setLabelBackgroundColor(View view, int backgroundColor) {
if (this.backgroundColor != backgroundColor) {
this.backgroundColor = backgroundColor;
view.invalidate();
}
}
public String getLabelText() {
return text;
}
public void setLabelText(View view, String text) {
if (!TextUtils.equals(this.text, text)) {
this.text = text;
Logger.d("setLabelText:" + text);
view.invalidate();
}
}
public int getLabelTextSize() {
return px2Dip(this.textSize);
}
public void setLabelTextSize(View view, int textSize) {
if (this.textSize != textSize) {
this.textSize = textSize;
view.invalidate();
}
}
}