demo链接:https://download.csdn.net/download/meixi_android/10802704

样式效果

实现方法:

1、自定义标签类

public class LabelImageView extends ImageView {LabelViewHelper utils;public LabelImageView(Context context) {this(context, null);}public LabelImageView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public LabelImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);utils = new LabelViewHelper(context, attrs, defStyleAttr);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);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;// simulatorprivate 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_TOPrectPath.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_TOPrectPath.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_BOTTOMrectPath.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_BOTTOMrectPath.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();}
}

3、activity。layout调用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ffffff"android:minHeight="180dp"><ImageViewandroid:id="@+id/text"android:layout_width="138dp"android:layout_height="100dp"android:layout_centerVertical="true"android:layout_marginLeft="8dp"android:scaleType="fitXY"android:src="@mipmap/defaul" /><com.lid.lib.LabelImageViewandroid:id="@+id/labelte"android:layout_width="138dp"android:layout_height="100dp"android:layout_centerVertical="true"android:layout_marginLeft="8dp"app:label_backgroundColor="#C2185B"app:label_height="30dp"app:label_orientation="LEFT_TOP"app:label_strokeWidth="0dp"app:label_text="CHINA" /><TextViewandroid:layout_width="200dp"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_centerVertical="true"android:text="sdfsdfsgbfwe范围分为范文芳 分物管费为 各位为危房违法各位各位各位为个人股为为为" />
</RelativeLayout>

Android 贴纸样式标签相关推荐

  1. android图片美化开源,GitHub - xingxing-yan/BLImage: Android中美化图片的库。功能包括滤镜,贴纸,标签,裁剪,涂鸦,亮度,饱和度,对比度,马赛克等功能...

    BLImage Android中美化图片的库.功能包括滤镜,贴纸,标签,裁剪,涂鸦,亮度,饱和度,对比度,马赛克等功能 效果图 添加依赖: 在project的build.gradle中添加: allp ...

  2. (转载)Android GradientDrawable(shape标签定义) 静态使用和动态使用(圆角,渐变实现)

    最近被吐槽界面太丑,还是很尴尬的,全公司就一个UI设计师,所以很多事情还是不忍直视,一个同事问我,背景可不可以使用渐变的感觉,然后我就有种突然感觉眼前一亮的感觉.还真的没有做过这方面的东西,单纯使用渐 ...

  3. android自定义样式大全:shape,selector,layer-list,style,动画全部内容

    原文:http://keeganlee.me/post/android/20150830 以下摘取了部分内容: shape 一般用shape定义的xml文件存放在drawable目录下,若项目没有该目 ...

  4. android 通知栏样式_Android通知样式

    android 通知栏样式 We've discussed and implemented basic Notifications in this post. In this tutorial, we ...

  5. android style(样式)和theme(主题)设置

    android应用程序如何设置样式,包括样式定义.单个view设置样式. 全局样式设置.样式继承关系. 1.样式定义 android的样式定义在res/values/style.xml文件中,类似we ...

  6. android SeekBar 样式大全

      UI参考   Xml代码   <SeekBar android:id="@+id/seekbar" style="?android:attr/progressB ...

  7. android实现标签功能,Android实现热门标签的流式布局

    一.概述: 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧(源码下载在下面最后给出) 类似的 ...

  8. JQuery中样式标签的处理

    增加样式标签 JQuery中增加样式使用.addClass(className)方法 通过动态改变类名(class),可以让其修改元素呈现出不同的效果.在HTML结构中里,多个class以空格分隔,当 ...

  9. Android 用户界面---样式和主题(Styles and Themes)(二)

    样式属性 理解了样式是如何定义的之后,就需要学习<item>元素都定义了那些有效的样式属性类型.你可能已经熟悉了像layout_width和textColor属性,但是还有更多的可以使用的 ...

最新文章

  1. 如何用java使用POI读取excel文件,创建excel文件,实现批量导出和导入
  2. contentSize、contentInset和contentOffset区别
  3. C排序算法:(三)插入排序
  4. 【分享】一个集成tracert和ping的网络监测工具
  5. androidbyte数组使用_android byte的用法
  6. 【POJ】【2699】The Maximum Number of Strong Kings
  7. 友善的小精灵 Casper
  8. 使用 jsbarcode 生成条形码
  9. 2022苏州市小学信息学奥赛T2-汉诺塔
  10. PowerShell路转粉之造轮子(01)------B站离线缓存简单合并blvm4s
  11. Springboot 集成帆软报表(finereport10.0)详细步骤
  12. ARPG游戏中怪物AI实现
  13. bat批处理,变量不生效
  14. CSS(3)教程 css的一般属性
  15. FHQ TREAP 学习总结
  16. 从数字化转变为数字化敏捷
  17. JDK8安装 及 环境变量配置(新手向)
  18. 【IIS音频传输】1、认识IIS
  19. 你已经拿到手的人工智能手(zha)机(dan)
  20. 爬虫神级解析工具之XPath:用法详解及实战

热门文章

  1. [css] 你有用过CSS预处理器吗?喜欢用哪个?原理是什么?
  2. [css] 当一个元素被设置为浮动后,它的display值变为什么呢?
  3. 前端学习(2767):下拉刷新的学习
  4. 前端学习(2520):环境搭建
  5. “约见”面试官系列之常见面试题之第九十六篇之active-class是谁的属性(建议收藏)
  6. 前端学习(715):数组新增元素
  7. 前端学习(672):if-else
  8. 前端学习(545):node的系统模块require
  9. 59 javabean的创建
  10. Python-100例(5-6) 排序斐波那契数列