Android 贴纸样式标签

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>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java研发工程师面试题(1)

Java研发工程师面试题(1) 基础题 一、String,StringBuffer, StringBuilder 的区别是什么&#xff1f;String为什么是不可变的&#xff1f;1. String是字符串常量&#xff0c;StringBuffer和StringBuilder是字符串变量。StringBuffer是线程安全的&#xff0c;StringBuilder是非线…

前端学习(2685):重读vue电商网站6之如何重置表单

element-ui 对表单提供了如下方法 resetFields&#xff0c;我们只需要获取表单对象数据即可重置我们的表单。 获取表单对象方式如下&#xff1a; 直接在表单处添加 ref属性&#xff0c;如下 loginFormRef&#xff0c;此引用即为我们表单实例。 然后&#xff0c;在我们重置按钮…

android Camera 设置焦距

1、添加Camera权限 2、判断是否支持变焦 public boolean isSupportZoom(){boolean isSuppport true;if (mCamera.getParameters().isSmoothZoomSupported()){isSuppport false;}return isSuppport;} 3、修改焦距 public void setZoom(){if (mIsSupportZoom){try{Parameters …

v-contextmenu的使用(右键菜单)

先来个自己改写的图&#xff1a; 代码&#xff1a; 结构&#xff1a;<div class"wrap" v-contextmenu:contextmenu><v-contextmenu ref"contextmenu"> <v-contextmenu-item ><i class"fa fa-search"></i>上插入&l…

前端学习(2686):重读vue电商网站7之登录预校验

在我们点击登录按钮&#xff0c;不应该直接发起网络请求&#xff0c;而是应该对表单进行预校验&#xff0c;检验成功才会发送请求。 拿到表单引用对象&#xff0c;即可进行对表单的校验。 首先&#xff0c;给登录按钮通过 click 来绑定一个事件 下一步&#xff0c;在 methods …

Android 循环滚动控件ViewFlipper,可实现跑马灯或轮播图效果

ViewFlipper——Android循环滚动控件 1、效果如下&#xff1a; 2、实现方法 &#xff08;1&#xff09;创建进出动画 上下滚动动画 y_in.xml <?xml version"1.0" encoding"utf-8"?> <set xmlns:android"http://schemas.android.com/a…

vue js table colspan rowspan

需求&#xff0c;要写一个菜单权限表。需要做到单元格合并&#xff0c;本来用的antd-vue的表格&#xff0c;然后构造customRender,总感觉有点本末倒置&#xff0c;其实自己实现&#xff0c;更快&#xff0c;而且想改哪里&#xff0c;改哪里。下面是写这个功能前的测试demo。 效…

前端学习(2687):重读vue电商网站8之设置弹框提示组件

首先&#xff0c;在 element.js 中导入弹框提示组件&#xff0c;但是它的配置与其它组件不一样&#xff0c;它需要进行全局挂载。 全局导入后&#xff0c;我们就可以在我们的登录组件 login.vue 中通过 this来访问弹框提示组件了。 测试一下&#xff0c;输入 admin 和 123456&a…

table 权限 展示页面

上篇文件介绍了基本的colspan和rowspan&#xff0c;这篇贴上一个学习代码&#xff0c;供以后修改。 效果如下&#xff1a;&#xff08;这个demo v-if 和 v-for 混用了&#xff0c;这个不好&#xff09; <template><div class"rbac-table"><div clas…

vue 公用组件开发 确认框confirm

文件目录&#xff1a; github地址&#xff1a;https://github.com/xingkongwuyu/vue-spa-experience/tree/master/src/components 最终的效果&#xff1a; 组件的源码解析&#xff1a; confirm &#xff1a; confirm的框架 ./index.js import confirmBox from ./src/index; ex…

前端学习(2688):重读vue电商网站9之el-menu 默认会有一个 border-right

这样会导致我们的菜单栏右边会有一个若隐若现的线条凸起 解决办法如下&#xff0c;直接将 el-menu 的border-right 设置为 none 即可。

Android studio 导入module方法

添加module方法步骤&#xff1a; &#xff08;1&#xff09;File----->New------>Import Module找到下载的citypicker文件&#xff0c;点击OK&#xff0c;点击Finish &#xff08;2&#xff09;app的build.gradle下的dependencies下添加 compile project(:citypicker)如…

vue构建项目

想把项目公司一些基础公用组件进行封装&#xff0c;所以需要对单组件进行开发优化。使用到Vue Cli 官方文档&#xff1a;https://cli.vuejs.org/zh/guide/build-targets.html 1、一个新环境&#xff0c;需要安装Vue Cli npm install -g vue/cli npm install -g vue/cli-serv…

前端学习(2689):重读vue电商网站10之表格展开页

只需要将 el-table-column 中 type 属性设为 expand 即能将表格进行展开。 实现效果如下&#xff1a;

AppTheme 属性详解

<style name"AppTheme" parent"Theme.AppCompat.Light.NoActionBar"><!--Appbar背景色&#xff0c;应用的主要色调&#xff0c;actionBar默认使用该颜色--><item name"android:colorPrimary">color/material_animations_prima…

前端学习(2690):重读vue电商网站11之使用树形控件 el-tree

对于分配权限一栏&#xff0c;我们需要如下效果&#xff1a; 相关配置属性&#xff1a; 其中 data 为我们的数据源&#xff0c;props 为我们在 tree组件显示的文本内容。通过设置 node-key可以让每个树节点作为唯一标识的属性&#xff0c;整棵树是唯一的&#xff1b;通过设置 …

Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长

1、复制音频文件到raw文件夹下 2、实例化音频文件 private final MediaPlayer.OnCompletionListener beepListener new MediaPlayer.OnCompletionListener() { // 声音public void onCompletion(MediaPlayer mediaPlayer) {mediaPlayer.seekTo(0);} }; private static final …

前端学习(2691):重读vue电商网站12之获取选中节点的keys:

首先&#xff0c;给我们对话框的确定按钮绑定一个事件。 主要使用 tree 组件提供的两个方法 getCheckedKeys 和 getHalfCheckedKeys来分别返回目前被选中的节点的 key 所组成的数组和目前半选中的节点的 key 所组成的数组

cmd 【已解决】windows连接手机,运行adb devices提示“unauthorized”

报错截图如下&#xff1a; 问题原因&#xff1a;电脑连接手机。手机未授权 解决方式&#xff1a; 设置----开发者选项-----打开USB调试&#xff0c;出现如下弹框&#xff0c;点击“确定”即可解决问题。 转载于:https://www.cnblogs.com/syw20170419/p/8280291.html

Android 可开关式顶部下拉view

效果&#xff1a; 实现方法 1、layout文件结构 最外部使用相对布局 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.c…