Android TextView两端对齐解决办法
短信预约 -IT技能 免费直播动态提醒
Android TextView两端对齐解决办法
今天遇到一个关于TextView文字两端对齐其实方案,大家都知道原生控件是不能满足我们的需求的,因此需要自定义View
下面看下效果图
package com.example.VerticalMarqueeTextView.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.text.TextPaint;import android.text.TextUtils;import android.util.AttributeSet;import android.view.ViewGroup;import android.view.ViewTreeObserver;import android.widget.TextView;public class WordAlignTextView extends TextView { private float textSize; private float textLineHeight; //顶部 private int top; //y轴 private int y; //线 private int lines; //底部 private int bottom; //右边 private int right; //左边 private int left; //线字 private int lineDrawWords; private char[] textCharArray; private float singleWordWidth; //每个字符的空隙 private float lineSpacingExtra; private boolean isFirst = true; public WordAlignTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { initTextInfo(); return true; } }); } public WordAlignTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public WordAlignTextView(Context context) { this(context, null, 0); } public void initTextInfo() { textSize = getTextSize(); //获取线的高度 textLineHeight = getLineHeight(); left = 0; right = getRight(); y = getTop(); // 要画的宽度 int drawTotalWidth = right - left; String text = getText().toString(); if (!TextUtils.isEmpty(text) && isFirst) { textCharArray = text.toCharArray(); TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); mTextPaint.density = getResources().getDisplayMetrics().density; mTextPaint.setTextSize(textSize); // 获取单个单词的的宽度 singleWordWidth = mTextPaint.measureText("一") + lineSpacingExtra; // 每行可以放多少个字符 lineDrawWords = (int) (drawTotalWidth / singleWordWidth); int length = textCharArray.length; lines = length / lineDrawWords; if ((length % lineDrawWords) > 0) { lines = lines + 1; } first = false; ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams(); int totalHeight = (int) (lines*textLineHeight+textLineHeight*2 + getPaddingBottom()+getPaddingTop()+layoutParams.bottomMargin+layoutParams.topMargin); setHeight(totalHeight); } } @Override protected void onDraw(Canvas canvas) { bottom = getBottom(); int drawTotalLine = lines; if(maxLine!=0&&drawTotalLine>maxLine){ drawTotalLine = maxLine; } for (int i = 0; i < drawTotalLine; i++) { try { int length = textCharArray.length; int mLeft = left; // 第i+1行开始的字符index int startIndex = (i * 1) * lineDrawWords; // 第i+1行结束的字符index int endTextIndex = startIndex + lineDrawWords; if (endTextIndex > length) { endTextIndex = length; y += textLineHeight; } else { y += textLineHeight; } for (; startIndex < endTextIndex; startIndex++) { char c = textCharArray[startIndex];// if (c == ' ') {// c = '\u3000';// } else if (c < '\177') {// c = (char) (c + 65248);// } canvas.drawText(String.valueOf(c), mLeft, y, getPaint()); mLeft += singleWordWidth; } } catch (Exception e) { e.printStackTrace(); } } } int maxLine; public void setMaxLines(int max){ this.maxLine = max; } public void setLineSpacingExtra(int lineSpacingExtra){ this.lineSpacingExtra = lineSpacingExtra; } public static boolean containChinese(String string){ boolean flag = false; for (int i = 0; i < string.length(); i++) { char c = string.charAt(i); if ((c >= 0x4e00) && (c <= 0x9FA5)) { flag = true; } } return flag; } public static String ToDBC(String input) { // 导致TextView异常换行的原因:安卓默认数字、字母不能为第一行以后每行的开头字符,因为数字、字母为半角字符 // 所以我们只需要将半角字符转换为全角字符即可 char c[] = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == ' ') { c[i] = '\u3000'; } else if (c[i] < '\177') { c[i] = (char) (c[i] + 65248); } } return new String(c); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Android TextView两端对齐解决办法
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
Android TextView两端对齐解决办法
Android TextView两端对齐解决办法今天遇到一个关于TextView文字两端对齐其实方案,大家都知道原生控件是不能满足我们的需求的,因此需要自定义View 下面看下效果图package com.example.VerticalM
2023-05-31
Android实现TextView两端对齐的方法
Android中的TextView控件默认是做不到两端对齐的,都是左对齐。可能的原因是安卓默认数字、字母不能为第一行以后每行的开头字符,因为数字、字母为半角字符,还有就是文字中的英文字符占用1个字节,而一个汉字占用两个字节。下面我就介绍下实
2022-06-06
Android TextView对齐的两种方法
Android TextView对齐的两种方法 在写Android布局文件时, 经常碰到如下图的TextView左右对齐的情况, 即姓名和手机号码纵向对齐。、 第一种方法: 在姓和名之间加空格, 但是如果用键盘的空格会在一些机型上对齐、
2023-05-30
Android 中的两端对齐实例详解
在android中的webview中,可以对文本内容进行对齐,具体方法如下 public class MainActivity extends Activity { @Override protected void onCreate(B
2022-06-06
2024-04-02
Android开发解决字符对齐问题方法
这篇文章主要为大家介绍了Android开发解决字符对齐问题方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-01
vant中field组件label属性两端对齐问题怎么解决
这篇文章主要介绍“vant中field组件label属性两端对齐问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vant中field组件label属性两端对齐问题怎么解决”文章能帮助大家解
2023-06-30
Android 中TextView的使用imageview被压缩问题解决办法
Android 中TextView的使用imageview被压缩问题解决办法
看下运行效果图:今天解bug的时候遇到一个奇怪的问题:listview的item由一个textview和一个imageview组成,父布局是线性水平排列。我的本意
2022-06-06
MySQL中出现乱码和表格不对齐的解决办法
摘要:MySQL中出现乱码和表格不对齐的问题可通过以下方法解决:乱码:检查和设置数据库编码使用SETNAMES语句转换数据表格不对齐:使用MySQLWorkbench调整列宽使用HTML/CSS样式使用PAD()函数其他解决方案:确保连接设置正确使用Unicode更新MySQL版本预防措施:使用正确的编码验证输入数据定期维护数据库
2024-04-02
解决Android模拟器端口被占用问题的办法
一、问题描述今天在Eclipse中运行Android项目时遇到"The connection to adb is down, and a severe error has occured"这个问题,如下图所示:第一次遇到这个问题,上网查了一
2022-06-06
Session对象失效的客户端解决方法284475处理办法
这篇文章主要介绍了Session对象失效的客户端解决方法,需要的朋友可以参考下
2023-05-20