Android 贴纸样式标签

utils.onDraw(canvas, getMeasuredWidth(), getMeasuredHeight());

}

public void setLabelText(String text) {

utils.setLabelText(this, text);

}

}

2、部分工具类

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 = 40;

private static final int DEFAULT_HEIGHT = 20;

private static final int DEFAULT_STROKE_WIDTH = 1;

private static final int DEFAULT_TEXT_SIZE = 14;

private static final int DEFAULT_BACKGROUND_COLOR = 0x9F27CDC0;

private static final int DEFAULT_STROKE_COLOR = 0xFFFFFFFF;

private static final int DEFAULT_TEXT_COLOR = 0xFFFFFFFF;

private static final int DEFAULT_ORIENTATION = LEFT_TOP;

private static final int DEFAULT_TEXT_STYLE = 0;

private int distance;

private int height;

private int strokeWidth;

private String text;

private int backgroundColor;

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;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

尾声

以薪资待遇为基础,以发展为最终目标,要在高薪资的地方,谋求最好的发展!

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
r-1712825590824)]
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-89IqDZpH-1712825590824)]

尾声

以薪资待遇为基础,以发展为最终目标,要在高薪资的地方,谋求最好的发展!

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

[外链图片转存中…(img-4NkcTnpp-1712825590824)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-ooGzSetK-1712825590825)]

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值