TextView自定义换行
来源:互联网 发布:淘宝新手开店视频教程 编辑:程序博客网 时间:2024/06/05 04:28
强制字符占满一行才换行,避免TextView中英混合过早换行,并且在最后添加点击文字
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) {// 使用默认画笔 getPaint().setColor(getCurrentTextColor()); getPaint().setUnderlineText(false);// 获取文字内容 String text = getText().toString();// 获取每个字符宽 float[] charWidths = new float[text.length()]; getPaint().getTextWidths(text, charWidths);// 点击文字宽 for (int i = clickStart; i < charWidths.length; i++) clickTextWidth += charWidths[i];// 循环换行输出 textLineFeed(canvas, text, charWidths); } /** * 换行,并在最后添加点击文字 */ private void textLineFeed(Canvas canvas, String text, float[] charWidths) {// 第一行文字基线Y坐标 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());// 避免点击文字中间换行,强制把点击文字换行输出 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(); }// 文本结束且不超过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); } /** * 在文字最后附加点击功能 * @param start 点击文字的起始位置 */ 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); }}
GitHub博客:http://lioil.win/2016/11/17/TextView-LineFeed.html
Coding博客:http://c.lioil.win/2016/11/17/TextView-LineFeed.html
0 0
- TextView自定义换行
- TextView 换行对齐自定义
- Android 自定义TextView 自动换行
- 自定义Textview显示自动换行
- 自定义TextView超过一行换行居中
- 【TextView】自定义TextView中文换行排版问题修复
- android 自定义textView,实现排版对齐和换行
- Android自定义组件之自动换行的TextView
- 自定义控件动态加载textview轻松实现换行
- android 自定义textView,实现排版对齐和换行
- android 自定义textView,实现排版对齐和换行
- 自定义控件解决android中TextView中英文换行问题
- Android——自定义LinearLayout自动换行,TextView垂直排列。
- 自动换行的textview 自定义view 识别英文
- 自定义TextView,解决文字换行,\n换行符换行,导致高度计算不对问题(计算ListView高度)
- android TextView 自动换行
- Android TextView换行问题
- TextView 实现自动换行
- 总结双指缩放图片的实现设计到的知识
- C# 委托代理静态的方法
- Java IO操作(6)
- 一个Filter 配置多个url-pattern
- 创建菜单;MAKEINTRESOURCE;菜单加入窗口的两种方式
- TextView自定义换行
- C++ fatal error LNK1104
- BZOJ 1433: [ZJOI2009]假期的宿舍
- java多线程
- C++ std_pair用法
- 深入理解-imooc 滚动显示效果制作
- Connection:Keep-Alive 和 Transfer-Encoding: chunk
- 引用与指针的区别
- C++ 类的使用