/**
- Created by 19219 on 2016/11/16.
- 強(qiáng)制字符占滿一行才換行,避免TextView中英混合過早換行客年,并且在最后添加點(diǎn)擊文字
*/
public class TextViewLineFeed extends TextView {
private float textX;
private float textY;
private int clickStart;
private ClickTextListner clickTextListner;
private float clickTextWidth;
protected void onDraw(Canvas canvas) {
// 使用默認(rèn)畫筆
getPaint().setColor(getCurrentTextColor());
getPaint().setUnderlineText(false);
// 獲取文字內(nèi)容
String text = getText().toString();
// 獲取每個(gè)字符寬
float[] charWidths = new float[text.length()];
getPaint().getTextWidths(text, charWidths);
// 點(diǎn)擊文字寬
for (int i = clickStart; i < charWidths.length; i++)
clickTextWidth += charWidths[i];
// 循環(huán)換行輸出
textLineFeed(canvas, text, charWidths);
}
/**
* 換行失仁,并在最后添加點(diǎn)擊文字
*/
private void textLineFeed(Canvas canvas, String text, float[] charWidths) {
// 第一行文字基線Y坐標(biāo)
textY = getTextSize();
for (int start = 0, end = 0, strLineLen = 0; end < charWidths.length; ++end) {
// 文本寬超過View寬雷激,換行輸出
if ((strLineLen += charWidths[end]) > getWidth()) {
if (end - 1 < clickStart) {
canvas.drawText(text.substring(start, end), 0, textY, getPaint());
} else {
canvas.drawText(text.substring(start, clickStart), 0, textY, getPaint());
// 避免點(diǎn)擊文字中間換行璧疗,強(qiáng)制把點(diǎn)擊文字換行輸出
getPaint().setColor(0xff0000ff);
getPaint().setUnderlineText(true);
canvas.drawText(text.substring(clickStart, charWidths.length), (textX = 0), (textY = textY + getLineHeight()), getPaint());
break;
}
strLineLen = 0;
start = end;
textY += getLineHeight();
}
// 文本結(jié)束且不超過View寬更啄,不換行輸出
if (end == charWidths.length - 1) {
canvas.drawText(text.substring(start, clickStart), 0, textY, getPaint());
textX = 0;
for (int i = start; i < clickStart; i++)
textX += charWidths[i];
getPaint().setColor(0xff0000ff);
getPaint().setUnderlineText(true);
canvas.drawText(text.substring(clickStart, ++end), textX, textY, getPaint());
}
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (event.getX() > textX &&
event.getX() < (textX + clickTextWidth) &&
event.getY() > (textY - getLineHeight()))
clickTextListner.clickText();
break;
}
return super.onTouchEvent(event);
}
/**
* 在文字最后附加點(diǎn)擊功能
* @param start 點(diǎn)擊文字的起始位置
*/
public void setClickText(int start) {
clickStart = start;
}
public interface ClickTextListner {
public void clickText();
}
public void setClickTextListner(ClickTextListner click) {
clickTextListner = click;
}
public TextViewLineFeed(Context context) {
this(context, null);
}
public TextViewLineFeed(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TextViewLineFeed(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}
簡(jiǎn)書: http://www.reibang.com/p/5d8c8448af1b
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/53711576
GitHub博客:http://lioil.win/2016/11/17/TextView-LineFeed.html
Coding博客:http://c.lioil.win/2016/11/17/TextView-LineFeed.html