效果图:

上面的是原生Textview,第一行末尾数字整体换行了,

下面是自定义Textview,第一行末尾数字分别在第一行和第二行展示

布局中  MyTextview记得换成自己包名下的

    <TextViewandroid:layout_margin="25dp"android:id="@+id/test_tv"android:lineSpacingExtra="8dp"android:textSize="15sp"android:textColor="#444444"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="文字文字文字文字文字文字文字文字文字1234567890字文字文字文字文字1234567890"/><com.littlejie.app.panterdialog.MyTextViewandroid:layout_margin="25dp"android:id="@+id/test_mytv"android:lineSpacingExtra="8dp"android:textSize="15sp"android:textColor="#444444"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="文字文字文字文字文字文字文字文字文字1234567890字文字文字文字文字1234567890"/>

自定义Textview:  MyTextView类

public class MyTextView extends View {//内容填充画笔private Paint contentPaint;//标准的字体颜色private String contentNormalColor = "#737373";//有焦点的字体颜色private String contentFocuedColor = "#333333";//控件宽度private int viewWidth = 0;//控件高度private int viewHeight = 0;//标准的字的样式public static final int TEXT_TYPE_NORMAL = 1;//控件获取焦点的时候进行的处理public static final int TEXT_TYPE_FOCUED = 2;//默认是标准的样式private int currentTextType = TEXT_TYPE_NORMAL;//默认当前的颜色private String textColor = "#444444";//字体大小private int textSize = 60;//内容private String mText = "测试的文字信息";//最小view高度private float minHeight = 0;//最小view宽度private float minWidth = 0;//行间距private float lineSpace;//最大行数private int maxLines = 0;//文字测量工具private Paint.FontMetricsInt textFm;///真实的行数private int realLines;//当前显示的行数private int line;//在末尾是否显示省略号private boolean showEllipsise;//文字显示区的宽度private int textWidth;//单行文字的高度private int signleLineHeight;private int mPaddingLeft,mPaddingRight,mPaddingTop,mPaddingBottom;/*** 省略号**/private String ellipsis = "...";public MyTextView(Context context) {this(context,null);}public MyTextView(Context context, AttributeSet attrs) {this(context, attrs,0);}public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initAttr(context,attrs);init();}private boolean isFristload;/*** 初始化*/private void init() {contentPaint = new Paint();contentPaint.setTextSize(textSize);contentPaint.setAntiAlias(true);contentPaint.setStrokeWidth(2);contentPaint.setColor(Color.parseColor(textColor));contentPaint.setTextAlign(Paint.Align.LEFT);textFm = contentPaint.getFontMetricsInt();signleLineHeight=Math.abs(textFm.top-textFm.bottom);}/*** 初始化属性* @param context* @param attrs*/private void initAttr(Context context,AttributeSet attrs) {TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyTextView);mPaddingLeft = typedArray.getDimensionPixelSize(R.styleable.MyTextView_paddingLeft, 0);mPaddingRight = typedArray.getDimensionPixelSize(R.styleable.MyTextView_paddingRight, 0);mPaddingTop = typedArray.getDimensionPixelSize(R.styleable.MyTextView_paddingTop, 0);mPaddingBottom = typedArray.getDimensionPixelSize(R.styleable.MyTextView_paddingBottom, 0);mText = typedArray.getString(R.styleable.MyTextView_text);textColor = typedArray.getString(R.styleable.MyTextView_textColor);if(textColor==null){textColor="#444444";}//   textSize = typedArray.getDimensionPixelSize(R.styleable.MyTextView_textSize, 60);textSize = typedArray.getDimensionPixelSize(R.styleable.MyTextView_textSize, DensityUtil.sp2px(context,15));lineSpace = typedArray.getInteger(R.styleable.MyTextView_lineSpacing, 20);typedArray.recycle();}public void setText(String ss){this.mText=ss;invalidate();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec,heightMeasureSpec);viewWidth=getMeasuredWidth();textWidth=viewWidth-mPaddingLeft-mPaddingRight;viewHeight= (int) getViewHeight();setMeasuredDimension(viewWidth, viewHeight);}private float getViewHeight() {char[] textChars=mText.toCharArray();float ww=0.0f;int count=0;StringBuilder sb=new StringBuilder();for(int i=0;i<textChars.length;i++){float v = contentPaint.measureText(textChars[i] + "");if(ww+v<=textWidth){sb.append(textChars[i]);ww+=v;}else{count++;sb=new StringBuilder();ww=0.0f;ww+=v;sb.append(textChars[i]);}}if(sb.toString().length()!=0){count++;}return count*signleLineHeight+lineSpace*(count-1)+mPaddingBottom+mPaddingTop;}@Overrideprotected void onDraw(Canvas canvas) {drawText(canvas);}/*** 循环遍历画文字* @param canvas*/private void drawText(Canvas canvas) {char[] textChars=mText.toCharArray();float ww=0.0f;float startL=0.0f;float startT=0.0f;startL+=mPaddingLeft;startT+=mPaddingTop+signleLineHeight/2+ (textFm.bottom-textFm.top)/2 - textFm.bottom;StringBuilder sb=new StringBuilder();for(int i=0;i<textChars.length;i++){float v = contentPaint.measureText(textChars[i] + "");if(ww+v<=textWidth){sb.append(textChars[i]);ww+=v;}else{canvas.drawText(sb.toString(),startL,startT,contentPaint);startT+=signleLineHeight+lineSpace;sb=new StringBuilder();ww=0.0f;ww+=v;sb.append(textChars[i]);}}if(sb.toString().length()>0){canvas.drawText(sb.toString(),startL,startT,contentPaint);}}}

在 res-values下attr.xml中添加属性

   <!--解决文字和数字换行不整齐--><declare-styleable name="MyTextView"><attr name="paddingLeft" format="dimension" /><attr name="paddingTop" format="dimension" /><attr name="paddingRight" format="dimension" /><attr name="paddingBottom" format="dimension" /><attr name="textSize" format="dimension" /><attr name="textColor" format="string" /><attr name="text" format="string"/><attr name="lineSpacing" format="integer" /><attr name="maxLine" format="integer"/><attr name="ellipsis" format="boolean" /></declare-styleable>

Activity中

  MyTextView testMyTv = findViewById(R.id.test_mytv);String str = "文字文字文字文字文字文字文字文字文字1234567890字文字文字文字文字1234567890";testMyTv.setText(str);

Android中自定义Textview解决文字和数字换行不整齐相关推荐

  1. Android中自定义TextView的形状--圆形-椭圆形-圆角矩形-线条

    基本步骤: 在drawable文件夹下建立一个shape.xml shape.xml: <?xml version="1.0" encoding="utf-8&qu ...

  2. android 字体跑马灯,Android中使用TextView实现文字跑马灯效果

    通常情况下我们想实现文字的走马灯效果需要在xml文件中这样设置 android:layout_width="wrap_content" android:layout_height= ...

  3. android 如何去掉自定义标签页,Android中为TextView增加自定义的HTML标签

    Android中的TextView,本身就支持部分的Html格式标签.这其中包括常用的字体大小颜色设置,文本链接等.使用起来也比较方便,只需要使用Html类转换一下即可.比如: textView.se ...

  4. Android中为TextView增加自定义的HTML标签

    为什么80%的码农都做不了架构师?>>>    Android中的TextView,本身就支持部分的Html格式标签.这其中包括常用的字体大小颜色设置,文本链接等.使用起来也比较方便 ...

  5. android 文字添加阴影,android中给TextView或许Button的文字添加阴影效果

    android中给TextView或者Button的文字添加阴影效果 1在代码中添加文字阴影 TextView 有一个方法 /** * Gives the text a shadow of the s ...

  6. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  7. android 自定义进度条_第一百八十九回:Android中自定义ProgressBar三

    各位看官们大家好,上一回中咱们说的是Android中自定义ProgressBar的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起Talk Android吧! 看官们,我们在上一回是通过自 ...

  8. android自定义省略号,Android开发自定义TextView省略号样式的方法

    本文实例讲述了Android开发自定义TextView省略号样式的方法.分享给大家供大家参考,具体如下: 在布局xml中设置textView的字段 android:maxLines="2&q ...

  9. android自定义起止时间的时间刻度尺,Android中自定义RecyclerView如何实现不固定刻度的刻度尺...

    Android中自定义RecyclerView如何实现不固定刻度的刻度尺 发布时间:2020-07-17 16:50:28 来源:亿速云 阅读:116 作者:小猪 这篇文章主要讲解了Android中自 ...

最新文章

  1. js插件---IUpload文件上传插件(包括图片)
  2. jquery日历插件 途牛_jquery日历插件SimpleCalendar
  3. 简书显示服务器错误,openfire服务器异常处理
  4. 中国城市商业银行产业模式展望及布局规模前景分析报告2021-2027年
  5. 一阶低通滤波器算法实现
  6. git remote传到远程
  7. 十八、vim进入编辑模式、vim命令模式、vim实践
  8. 机场也应该取个好听的名
  9. matlab结构数组增加域,如何用matlab创建结构数组
  10. 今日头条里放H5链接如何直接跳转到微信小商店
  11. 《前端》阿里字体库iconfont使用方法
  12. SpringBoot第二特性:Starter启动依赖_01_自己动手写一个Starter组件
  13. 2016 黑客必备的Android应用都有哪些?
  14. easyUI入门教程
  15. 防治颈椎病,别陷入误区
  16. LATEX使用 图文混排,文字环绕插图
  17. 知道创宇研发技能表3.1
  18. CF407B 「Long Path」
  19. 奇异值分解(SVD)及其应用
  20. 开源EDR(OSSEC)基础篇- 01 -设计定位与能力输出

热门文章

  1. vue项目中使用 webpack优化之HappyPack 实战
  2. 一些Qt第三方语言绑定库
  3. 批量清空表数据(不删除表)
  4. 怎么用anaconda打开py文件?
  5. 英特尔XPU全面创新,面向HPC与AI领域
  6. django配置环境linux,linux环境下Django的安装配置详解
  7. 一个站长常用的类似于获取关键词排名的工具类
  8. head中一些标签的常见用法
  9. QorIQ SDK环境搭建
  10. html上的样式 ui vant_Vant UI的组件使用问题