Android 贴纸样式标签

private int strokeColor;

private int textSize;

private int textStyle;

private int textColor;

private boolean visual;

private int orientation;

// private float startPosX;

// private float startPosY;

// private float endPosX;

// private float endPosY;

private Paint rectPaint;

private Paint rectStrokePaint;

// simulator

private Path rectPath;

private Path textPath;

private Paint textPaint;

private Rect textBound;



private Context context;

private int alpha;



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));

    strokeWidth = attributes.getDimensionPixelSize(R.styleable.LabelView\_label\_strokeWidth, dip2Px(DEFAULT\_STROKE\_WIDTH));

    text = attributes.getString(R.styleable.LabelView\_label\_text);

    backgroundColor = attributes.getColor(R.styleable.LabelView\_label\_backgroundColor, DEFAULT\_BACKGROUND\_COLOR);

    strokeColor = attributes.getColor(R.styleable.LabelView\_label\_strokeColor, DEFAULT\_STROKE\_COLOR);

    textSize = attributes.getDimensionPixelSize(R.styleable.LabelView\_label\_textSize, dip2Px(DEFAULT\_TEXT\_SIZE));

    textStyle = attributes.getInt(R.styleable.LabelView\_label\_textStyle, DEFAULT\_TEXT\_STYLE);

    textColor = attributes.getColor(R.styleable.LabelView\_label\_textColor, DEFAULT\_TEXT\_COLOR);

    visual = attributes.getBoolean(R.styleable.LabelView\_label\_visual, true);

    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.FILL);



    rectStrokePaint = new Paint();

    rectStrokePaint.setDither(true);

    rectStrokePaint.setAntiAlias(true);

    rectStrokePaint.setStyle(Paint.Style.STROKE);



    rectPath = new Path();

    rectPath.reset();



    textPath = new Path();

    textPath.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 || text == null) {

        return;

    }



    float actualDistance = distance + height / 2;

    calcOffset(measuredWidth, measuredHeight);



    rectPaint.setColor(backgroundColor);

    if (alpha != 0) {

        rectPaint.setAlpha(alpha);

    }



    rectStrokePaint.setColor(strokeColor);

    rectStrokePaint.setStrokeWidth(strokeWidth);



    canvas.drawPath(rectPath, rectPaint);

    canvas.drawPath(rectPath, rectStrokePaint);



    textPaint.setTextSize(textSize);

    textPaint.setColor(context.getResources().getColor(R.color.white));

    textPaint.getTextBounds(text, 0, text.length(), textBound);

    textPaint.setTypeface(Typeface.defaultFromStyle(textStyle));



    float begin\_w\_offset = (1.4142135f \* actualDistance) / 2 - textBound.width() / 2;

    if (begin\_w\_offset < 0) begin\_w\_offset = 0;



    canvas.drawTextOnPath(text, textPath, begin\_w\_offset, textBound.height() / 2, textPaint);

}



private void calcOffset(int measuredWidth, int measuredHeight) {

    float startPosX = measuredWidth - distance - height;

    float endPosX = measuredWidth;

    float startPosY = measuredHeight - distance - height;

    float endPosY = measuredHeight;



    float middle = height/2;



    switch (orientation) {

        case 1: // LEFT\_TOP



            rectPath.reset();

            rectPath.moveTo(0, distance);

            rectPath.lineTo(distance, 0);

            rectPath.lineTo(distance + height, 0);

            rectPath.lineTo(0, distance + height);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(0, distance + middle);

            textPath.lineTo(distance + middle, 0);

            textPath.close();



            break;

        case 2: // RIGHT\_TOP



            rectPath.reset();

            rectPath.moveTo(startPosX, 0);

            rectPath.lineTo(startPosX + height, 0);

            rectPath.lineTo(endPosX, distance);

            rectPath.lineTo(endPosX, distance + height);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(startPosX + middle, 0);

            textPath.lineTo(endPosX, distance + middle);

            textPath.close();



            break;

        case 3: // LEFT\_BOTTOM



            rectPath.reset();

            rectPath.moveTo(0, startPosY);

            rectPath.lineTo(distance + height, endPosY);

            rectPath.lineTo(distance, endPosY);

            rectPath.lineTo(0, startPosY + height);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(0, startPosY + middle);

            textPath.lineTo(distance + middle, endPosY);

            textPath.close();



            break;

        case 4: // RIGHT\_BOTTOM



            rectPath.reset();

            rectPath.moveTo(startPosX, endPosY);

            rectPath.lineTo(measuredWidth, startPosY);

            rectPath.lineTo(measuredWidth, startPosY + height);

            rectPath.lineTo(startPosX + height, endPosY);

            rectPath.close();



            textPath.reset();

            textPath.moveTo(startPosX + middle, endPosY);

            textPath.lineTo(endPosX, startPosY + middle);

            textPath.close();



            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 getLabelStrokeWidth() {

    return px2Dip(this.strokeWidth);

}



public void setLabelStrokeWidth(View view, int strokeWidth) {

    if (this.strokeWidth != dip2Px(strokeWidth)) {

        this.strokeWidth = dip2Px(strokeWidth);

        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 int getLabelStrokeColor() {

    return strokeColor;

}



public void setLabelStrokeColor(View view, int strokeColor) {

    if (this.strokeColor != strokeColor) {

        this.strokeColor = strokeColor;

        view.invalidate();

    }

}





public void setLabelBackgroundAlpha(View view, int alpha) {

    if (this.alpha != alpha) {

        this.alpha = alpha;

        view.invalidate();

    }

}



public String getLabelText() {

    return text;

}



public void setLabelText(View view, String text) {

    if (this.text == null || !this.text.equals(text)) {

        this.text = 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();

    }

}



public int getLabelTextStyle(){

    return textStyle;

}



public void setLabelTextStyle(View view, int textStyle){

    if(this.textStyle == textStyle) return;

    this.textStyle = textStyle;

    view.invalidate();
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值