博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[置顶] android 自定义TextView
阅读量:4326 次
发布时间:2019-06-06

本文共 4769 字,大约阅读时间需要 15 分钟。

系统自带的控件TextView有时候没满一行就换行了,为了解决这个问题,自定义了一个TextView,只有一行显示不完全的情况下才会去换行显示,代码如下:

 

package com.open.textview;import java.util.ArrayList;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.text.TextUtils;import android.util.AttributeSet;import android.view.View;/** * 不换行的TextView * @author Administrator * */public class CusTextView extends View {	    protected float textSize=35;      protected float paddingLeft=0;    protected float paddingRight=0;    protected float paddingTop=0;    protected float paddingBottom=0;        protected float lineSpace=5;     protected int lineWidth=320;    protected float lineHeight=20;    protected int lineCount;    protected int maxLines=-1;//最大的行数        protected String mText;    protected ArrayList
lineList=new ArrayList
(0);//行的字符串索引 protected Paint mPaint = new Paint(); { mPaint.setTextSize(textSize); mPaint.setAntiAlias(true); } public CusTextView(Context context) { super(context); } public CusTextView(Context context, AttributeSet attrs) { super(context, attrs); } public CusTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setText(String text) { this.mText = text; lineList.clear(); requestLayout(); invalidate(); } public void setText(String text,int maxLines) { this.maxLines=maxLines; this.setText(text); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if(TextUtils.isEmpty(mText)) { setMeasuredDimension(0, 0); return; } lineWidth=(int)(MeasureSpec.getSize(widthMeasureSpec)-paddingLeft-paddingRight);//每行的宽度 Rect bounds = new Rect(); mPaint.getTextBounds(mText, 0, mText.length(), bounds); lineHeight=bounds.bottom-bounds.top; maxLines=-1; lineList.clear(); calculate(); lineCount=lineList.size();//总行数 maxLines=(maxLines>0)?Math.min(lineCount, maxLines):lineCount; int measuredHeight=0;//总的高度 if(maxLines>0) { measuredHeight+=(paddingTop+paddingBottom);//顶部与底部 measuredHeight+=(maxLines-1)*lineSpace;//空隙的间隔 measuredHeight+=(maxLines*(lineHeight));//行高之和 } int result=measuredHeight; int specMode = MeasureSpec.getMode(heightMeasureSpec); int specSize = MeasureSpec.getSize(heightMeasureSpec); switch (specMode) { case MeasureSpec.UNSPECIFIED: result = measuredHeight; break; case MeasureSpec.AT_MOST: result = Math.min(measuredHeight, specSize); break; case MeasureSpec.EXACTLY: result = specSize; break; } setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), result); } @Override protected void onDraw(Canvas canvas) { if(TextUtils.isEmpty(mText)) { return; } for(int i=0;i
=mText.length()) { break; } startIndex=itemLine[1]; } } private int[] getIndexArray(int startIndex) { int[] ret=new int[2]; int canholdcharSize=0; int singleCharWidth=(int) mPaint.measureText(mText, startIndex, startIndex+1);//单个字符宽度 singleCharWidth=Math.max(singleCharWidth, 1); canholdcharSize=lineWidth/singleCharWidth;//每行可以容纳的字数,非精确值 if(isOutOfIndex(startIndex,canholdcharSize))//检查是否越界了 { canholdcharSize=mText.length()-startIndex; } if(isFitness(startIndex,canholdcharSize,lineWidth))//如果linecharSize个字符还小于单行的长度,需要再次自加长度来判断 { while(true) { canholdcharSize++; if(isOutOfIndex(startIndex,canholdcharSize)) { canholdcharSize--; break; } if(isFitness(startIndex,canholdcharSize,lineWidth)) { continue; } else { canholdcharSize--; break; } } } else //需要再次自减长度来判断 { while(true) { canholdcharSize--; if(isFitness(startIndex,canholdcharSize,lineWidth)) { break; } else { continue; } } } ret[0]=startIndex; ret[1]=(startIndex+canholdcharSize); return ret; } private boolean isOutOfIndex(int startIndex,int linecharSize) { return startIndex+linecharSize>mText.length(); } private boolean isFitness(int startIndex,int canholdcharSize,int lineWidth) { return mPaint.measureText(mText, startIndex, startIndex+canholdcharSize)<=lineWidth; } public class LineParams { public int startIndex; public int endIndex; public LineParams(int startIndex, int endIndex) { this.startIndex = startIndex; this.endIndex = endIndex; } public boolean isInnerRange(int testNum) { return (testNum>=startIndex&&testNum<=endIndex); } @Override public String toString() { return "LineParams [startIndex=" + startIndex + ", endIndex="+ endIndex + "]"; } }}

 

Demo地址:

 

邮箱:zz7zz7zz@163.com

微博:

 

 

 

转载于:https://www.cnblogs.com/pangblog/p/3285616.html

你可能感兴趣的文章
十九、CSS如何引入字体
查看>>
DS博客作业07--查找
查看>>
c# Invalidate() Update() Refresh()的区别
查看>>
work of 1/5/2016
查看>>
自己做了个微信小程序
查看>>
CMD获取当前目录的绝对路径
查看>>
HTML5新规范和CSS3新特性
查看>>
使用php后台给自己做一个页面路由,配合ajax实现局部刷新。
查看>>
类与对象(二)
查看>>
NSString 的常用方法
查看>>
mysql的engine不同,导致事物回滚失败的问题
查看>>
JAVAWeb使用POI做导出Excel
查看>>
今天解决了首页无头像被显示的问题
查看>>
charts 画折线图
查看>>
[py]__name__ 属于哪个文件
查看>>
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>
实验四【bx】和loop的使用
查看>>
P1313 计算系数
查看>>