目前相关文字下方添加虚线的文章非常少,备选方案有:

  1. 文字下方添加一个drawable实现虚线样式
  2. 通过spannable方案自定义
  3. 通过textview的getpaint实现
  4. 实现自定义并绘制

最后还是选择第四种方案,因为前三种方案基本没有相关参数能设置虚线,第一种能实现,但是无法判断当前文字长度,很难控制虚线绘制长度,如果采用点9,会导致拉伸问题。废话不多说了,直接上代码。

1)自定义DashTextView继承TextView.如果有实现换肤功能的朋友,TextView替换成SkinCompatTextView如下

public class DashTextView extends SkinCompatTextView {
复制代码

2)先初始化画笔,并设置虚线离文字的间距。画笔样式就不多说了,颜色,线条粗细,虚线长短和间隙等。

private void initPaint(){mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//默认使用textview当前颜色mPaint.setColor(getResources().getColor(color));mPaint.setStrokeWidth(3);mPaint.setStyle(Paint.Style.STROKE);mPaint.setPathEffect(new DashPathEffect(new float[] {5, 5}, 0));mPath = new Path();//设置虚线距离setPadding(0,0,0,3);
}复制代码

3)绘制线条

@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);setLayerType(LAYER_TYPE_SOFTWARE, null);int centerY = getHeight();mPath.reset();mPath.moveTo(0, centerY);mPath.lineTo(getWidth(), centerY);canvas.drawPath(mPath, mPaint);
}复制代码

将画笔moveTo坐标x=0,y=getHeight()处,通过lineTo标记画线终点x=getWidth(),y不变。最后直接drawPath基本告成。

看似完美,但是有一个问题显露出来,就是textview的长度并不代表文字的长度,例如换行,如果一个英文单词过长,会导致右边留下非常长的一片空白区域,但是虚线在空白区域也会绘制。所以为了解决解决这个问题,我们就必须知道文字长度,而且是每行文字长度,然后取出最大长度绘制虚线。

//获取每行长度,选取最大长度。因为部分手机换行导致虚线过长
private float getTextWidth(){float textWidth = 0;//循环遍历打印每一行for (int i = 0; i < getLineCount(); i++) {if(textWidth < getLayout().getLineWidth(i)){textWidth = getLayout().getLineWidth(i);}}return textWidth == 0 ? getWidth() : textWidth;
}复制代码

将getWidth()换成getTextWidth(),自适应虚线长度等同于最长那行的文字长度。

最后就是实现点击功能了,以点击文字,跳出弹窗给出文字内容为例子,我们可以自定义想要的属性

<declare-styleable name="DashTextView"><attr name="title" format="string"/><attr name="tips" format="string"/><attr name="color" format="color"/><attr name="dash" format="boolean"/>
</declare-styleable>复制代码

title:弹窗的标题

tips:弹窗的内容

color:虚线的颜色

dash: 是否显示虚线。有些虚线可能是加在adapter中,这个时候可以通过这个来控制是否显示虚线。

初始化这些自定义属性

private void initView(Context context,AttributeSet attrs){color = R.color.gray;if(attrs != null){TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DashTextView);//点击弹窗标题if (typedArray.hasValue(R.styleable.DashTextView_title)) {title = typedArray.getString(R.styleable.DashTextView_title);}//点击弹窗内容if (typedArray.hasValue(R.styleable.DashTextView_tips)) {tips = typedArray.getString(R.styleable.DashTextView_tips);}//虚线颜色if (typedArray.hasValue(R.styleable.DashTextView_color)) {color = typedArray.getResourceId(R.styleable.DashTextView_color,R.color.text_trans_gray3);}//是否显示虚线if (typedArray.hasValue(R.styleable.DashTextView_dash)) {dash = typedArray.getBoolean(R.styleable.DashTextView_dash,true);}}initPaint();setOnClickListener(v -> {new CommonAlertDialog(context).showTipsDialog(TextUtils.isEmpty(title) ? getText().toString() : title,tips);});
}复制代码

已经完成了。最后把完整代码贴上,方便大家研究和拓展。

public class DashTextView extends SkinCompatTextView {private Paint mPaint;private Path mPath;private String tips;private String title;private int color;private boolean dash = true;//默认有虚线public DashTextView(Context context) {super(context);}public DashTextView(Context context, AttributeSet attrs) {super(context, attrs);initView(context,attrs);}public DashTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context,attrs);}private void initView(Context context,AttributeSet attrs){color = R.color.gray;if(attrs != null){TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DashTextView);//点击弹窗标题if (typedArray.hasValue(R.styleable.DashTextView_title)) {title = typedArray.getString(R.styleable.DashTextView_title);}//点击弹窗内容if (typedArray.hasValue(R.styleable.DashTextView_tips)) {tips = typedArray.getString(R.styleable.DashTextView_tips);}//虚线颜色if (typedArray.hasValue(R.styleable.DashTextView_color)) {color = typedArray.getResourceId(R.styleable.DashTextView_color,R.color.gray);}//是否显示虚线if (typedArray.hasValue(R.styleable.DashTextView_dash)) {dash = typedArray.getBoolean(R.styleable.DashTextView_dash,true);}}initPaint();setOnClickListener(v -> {new CommonAlertDialog(context).showTipsDialog(TextUtils.isEmpty(title) ? getText().toString() : title,tips);});}private void initPaint(){mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//默认使用textview当前颜色mPaint.setColor(getResources().getColor(color));mPaint.setStrokeWidth(3);mPaint.setStyle(Paint.Style.STROKE);mPaint.setPathEffect(new DashPathEffect(new float[] {5, 5}, 0));mPath = new Path();//设置虚线距离setPadding(0,0,0,3);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);setLayerType(LAYER_TYPE_SOFTWARE, null);int centerY = getHeight();mPath.reset();mPath.moveTo(0, centerY);mPath.lineTo(getTextWidth(), centerY);canvas.drawPath(mPath, mPaint);}//获取每行长度,选取最大长度。因为部分手机换行导致虚线过长private float getTextWidth(){float textWidth = 0;//循环遍历打印每一行for (int i = 0; i < getLineCount(); i++) {if(textWidth < getLayout().getLineWidth(i)){textWidth = getLayout().getLineWidth(i);}}return textWidth == 0 ? getWidth() : textWidth;}}复制代码

在使用的时候

<包名.view.DashTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:tips="弹窗内容"app:title="弹窗标题"android:text="文字内容"/>复制代码

希望对大家有所帮助,谢谢!

作者:糖哥
链接:https://juejin.im/post/5c47d2d16fb9a04a0c2ec80a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

android自定义TextView添加虚线下划线相关推荐

  1. android定义一条虚线,android自定义TextView添加虚线(虚线下划线)

    目前相关文字下方添加虚线的文章非常少,备选方案有: 1 文字下方添加一个drawable实现虚线样式 2 通过spannable方案自定义 3 通过textview的getpaint实现 4 实现自定 ...

  2. android下划线链接,Android使用TextView实现无下划线超链接的方法

    本文实例讲述了Android使用TextView实现无下划线超链接的方法.分享给大家供大家参考,具体如下: Android系统默认把网址.电话.地图(geo地址).邮箱等转换为超链接. 具体请查看 a ...

  3. html 修改下划线粗细,TextView设置内容下划线加粗等html样式实例及注意事项

    TextView设置内容下划线加粗等html样式实例及注意事项 效果图 test01.png Java代码 package com.myapplication; import android.app. ...

  4. android背景颜色动态修改,Android自定义TextView带圆角及背景颜色(动态改变圆角背景颜色)...

    最近根据项目需求自定义了一个TextView控件,主要用来做状态的标识,比如一个订单状态有各种,当然了这种设置在Android中可以直接用xml文件来处理,但是对于xml文件太过于麻烦,针对不同的颜色 ...

  5. css里给文字加下划线代码,css添加文字下划线样式的方法

    css添加文字下划线样式的方法 发布时间:2020-08-31 13:54:27 来源:亿速云 阅读:65 作者:小新 这篇文章将为大家详细讲解有关css添加文字下划线样式的方法,小编觉得挺实用的,因 ...

  6. php css下划线,css如何添加文字下划线样式?(代码详解)

    css如何添加文字下划线样式?本篇文章就给大家介绍css添加文字下划线样式的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 首先我们来了解一下css添加文字下划线样式的方法有哪 ...

  7. android 微信朋友圈 全功能,Android仿微信朋友圈文字展开全文功能 Android自定义TextView仿微信朋友圈文字展开全文功能...

    Android自定义TextView仿微信朋友圈文字信息,展开全文功能 代码及注释如下: 首先写一个xml文件 showmore.xml: android:orientation="vert ...

  8. Android自定义Textview 蒙语显示(蒙古文字)

    Android自定义Textview 蒙语显示(蒙古文字) 竖排Textview 自动换行 从左到右 蒙语字体包 demo下载地址 https://download.csdn.net/download ...

  9. 如何给PDF文件文本添加绿色下划线?PDF下划线工具怎么用?

    我们在阅读PDF文件的时候,有时根据不同重点需要给PDF添加不同颜色的下划线,那么如何给PDF文本添加绿色下划线?给PDF添加不同颜色的下划线是给PDF添加注释的类型之一,我们不仅可以给PDF文件添加 ...

最新文章

  1. iOS 通知观察者的被调函数不一定运行在主线程
  2. Ciruy英雄谭 Chapter 1 序章
  3. C# 泛型可能导致的装箱操作陷阱
  4. 细说HTML元素的ID和Name属性的区别
  5. css border 虚线间距_【前端冷知识】CSS如何实现虚线框动画
  6. Bootstrap3 带提示的进度条
  7. linux 如何查看远程代码分支,linux看git 创建分支、删除本地分支、查看远程分支、本地分支例子...
  8. JXLS 2.4.0学习
  9. matlab节约里程法_节约里程法matlab.doc
  10. 专题2:弹性力学中平面问题的基本理论(2-4 几何方程及刚体位移 2-5 斜方向的应变及位移)
  11. Rate This Topic
  12. 机器学习四 数据的差异性
  13. 组合逻辑电路二——数字逻辑实验
  14. 弘辽科技:淘宝新店提升销量可以吗?怎么提升关键词?
  15. python有趣的库_python的一些比较冷门、但是有趣的库 - 标签 - 古明地盆 - 博客园...
  16. ofdm系统matlab仿真,基于Simulink 的OFDM 系统仿真分析
  17. 智慧应管理信息化 平台建设方案
  18. 化工制造业的ERP解决方案
  19. 如何在Windows系统下多开微信
  20. ubuntu连不上网络,连wifi图标也没有显示

热门文章

  1. spring-boot-maven-plugin:3.0.0:repackage 报错原因
  2. cmpp2.0如何实现网关短信发送
  3. 常用的电平标准TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等
  4. PS中值得推荐的四款外挂滤镜
  5. 关于《M3U8解码工具》的使用
  6. JTAG0引脚复用GPIO问题
  7. 求解麦克斯韦方程族时需要构建的神经网络
  8. SpringBoot整合通用mapper实现泛型BaseController增删改
  9. PySpark学习案例——北京空气质量分析
  10. STEAM课程的五大教学策略