textview在多行情况下如何显示省略号

package com.baidu.netdisk.ui;


import java.util.ArrayList;
import java.util.List;


import android.content.Context;
import android.graphics.Canvas;
import android.text.Layout;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;


/**
 * 在缩略图的情况下,当文件名超过长度时显示省略号
 */


public class EllipsizeText extends TextView{


//要显示的省略号
private static final String ELLIPSIS = "...";  

private static final String TAG = "EllipsizeText";

private float lineSpacingMultiplier = 1.0f;   
private float lineAdditionalVerticalPadding = 0.0f;  

private final List<EllipsizeListener> ellipsizeListeners = new ArrayList<EllipsizeListener>();


private boolean isEllipsized;   
private boolean isStale;   
private boolean programmaticChange;   
private String fullText;   
private int maxLines = -1;      

public EllipsizeText(Context context) {
super(context);
}

public EllipsizeText(Context context, AttributeSet attrs) {
super(context, attrs);
}

public EllipsizeText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub

}


//是否会在文字过多的时候显示省略符号
public boolean isEllipsized() {   
return isEllipsized;   
}   


//重写setMaxLines的方法,因为只有在代码中setMaxLine才有效
@Override   
public void setMaxLines(int maxLines) {  
super.setMaxLines(maxLines);   
this.maxLines = maxLines;   
isStale = true;   
}   


public int getMaxLines() {   
return maxLines;   
}   


@Override   
public void setLineSpacing(float add, float mult) {   
this.lineAdditionalVerticalPadding = add;   
this.lineSpacingMultiplier = mult;   
super.setLineSpacing(add, mult);   
}   


@Override   
protected void onTextChanged(CharSequence text, int start, int before, int after) {   
super.onTextChanged(text, start, before, after);   
if (!programmaticChange) {   
fullText = text.toString();
isStale = true;   
}   
}   


@Override   
protected void onDraw(Canvas canvas) { 
Log.v(TAG, "onDraw");
if (isStale) {   
super.setEllipsize(null);   
resetText();  
Log.v(TAG, "resetText");
}   
super.onDraw(canvas);   
}   

//最关键的部分在这里,其实就是将用要显示的文本创建一个text layout然后在这个layout的maxline大于咱们设定的的maxline的时候就截取字符串,并加上省略号

//然后再用截取加上省略号的文字再创建text layout比较是否是大于maxline,然后大于的话就每次将字符串-1,知道等于maxline,这个时候就是咱们要显示的文字了

private void resetText() {   
int maxLines = getMaxLines();   
String workingText = fullText;  
Log.v(TAG, "workingText="+workingText);
boolean ellipsized = false;   
if (maxLines != -1) {   
Layout layout = createWorkingLayout(workingText);   
if (layout.getLineCount() > maxLines) {   
//获取一行显示字符个数,然后截取字符串数
workingText = fullText.substring(0, layout.getLineEnd(maxLines - 1)).trim()+ ELLIPSIS;   
Layout layout2=createWorkingLayout(workingText);
while (layout2.getLineCount() > maxLines) {   
int lastSpace = workingText.length()-1;  
Log.v(TAG, "lastSpace="+lastSpace);
if (lastSpace == -1) {   
break;   
}   
workingText = workingText.substring(0, lastSpace); 
layout2=createWorkingLayout(workingText + ELLIPSIS);
Log.v(TAG, "lastSpace workingText="+workingText);
}   
workingText = workingText + ELLIPSIS;   
ellipsized = true;   
}   
}   
if (!workingText.equals(getText())) {   
programmaticChange = true;   
try {   
setText(workingText);   
invalidate();
} finally {   
programmaticChange = false;   
}   
}   
isStale = false;   
if (ellipsized != isEllipsized) {   
isEllipsized = ellipsized;   
for (EllipsizeListener listener : ellipsizeListeners) {   
listener.ellipsizeStateChanged(ellipsized);   
}   
}   
}   

//返回textview的显示区域的layout,该textview的layout并不会显示出来,只是用其宽度来比较要显示的文字是否过长
private Layout createWorkingLayout(String workingText) {   
//字符串资源,画笔,layout的宽度,Layout的样式,字体的大小,行间距
return new StaticLayout(workingText, getPaint(), getWidth() - getPaddingLeft() - getPaddingRight(),   
Alignment.ALIGN_NORMAL, lineSpacingMultiplier, lineAdditionalVerticalPadding, false);   
}   


}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值