Android TextView两端对齐解决办法

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; /** * Created by John on 2017/2/9. */ 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; } /** * 判断是否为中文 * @return */ 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); } }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2024-10-24 18:32:12

Android TextView两端对齐解决办法的相关文章

Android实现TextView两端对齐的方法_Android

Android中的TextView控件默认是做不到两端对齐的,都是左对齐.可能的原因是安卓默认数字.字母不能为第一行以后每行的开头字符,因为数字.字母为半角字符,还有就是文字中的英文字符占用1个字节,而一个汉字占用两个字节.下面我就介绍下实现两端对齐的原理: 1.测量一个中文汉字所占用的宽度 2.根据TextView的宽度和一个汉字所占用的宽度以及字符之间的间隔计算出总行数. 3.根据padding和margin以及行高计算出TextView的总高度. 4.绘制每一行的每一个字符 效果如下: 具

Android webview 遇到android.os.FileUriExposedException错误解决办法

Android webview 遇到android.os.FileUriExposedException错误解决办法 1. 在 Manifest 文件中添加: <manifest ...> <application ...> <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider&

Android实现TextView两端对齐的方法

Android中的TextView控件默认是做不到两端对齐的,都是左对齐.可能的原因是安卓默认数字.字母不能为第一行以后每行的开头字符,因为数字.字母为半角字符,还有就是文字中的英文字符占用1个字节,而一个汉字占用两个字节.下面我就介绍下实现两端对齐的原理: 1.测量一个中文汉字所占用的宽度 2.根据TextView的宽度和一个汉字所占用的宽度以及字符之间的间隔计算出总行数. 3.根据padding和margin以及行高计算出TextView的总高度. 4.绘制每一行的每一个字符 效果如下: 具

Android ListView出现异常解决办法_Android

Android ListView 异常解决办法: ListView:The content of the adapter has changed but ListView did not receive a notification使用ListView时遇到如下的异常信息: 10-26 18:30:45.085: E/AndroidRuntime(7323): java.lang.IllegalStateException: The content of the adapter has chan

Caused by: android.os.NetworkOnMainThreadException错误解决办法

好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: android.os.NetworkOnMainThreadException,查了下原因上在4.0之后在主线程里面执行Http请求都会报这个错,大概是怕Http请求时间太长造成程序假死的情况吧. 解决办法有两个思路,分别是: 第一种方法:直接忽视,强制使用(强烈不推荐,但是修改简单) 在MainActivity文件的setContentView(R.layout

Android ListView出现异常解决办法

Android ListView 异常解决办法: ListView:The content of the adapter has changed but ListView did not receive a notification使用ListView时遇到如下的异常信息: 10-26 18:30:45.085: E/AndroidRuntime(7323): java.lang.IllegalStateException: The content of the adapter has chan

Android Studio INSTALL_FAILED_UID_CHANGED的解决办法

使用Android Studio开发Android应用,把Android应用调试安装在手机上时,出现了安装失败的提示:INSTALL_FAILED_UID_CHANGED. 上网找了很多资料:               1.说是没有卸载干净,需要使用adb shell命令删除应用的残留文件夹.                1 cd /data/data 2 rm -r 应用包名   http://stackoverflow.com/questions/16277422/android-ins

【游戏开发备注之一】关于COCOS2DX_V1.X版本IPHONE与ANDROID运行出现图片白块、添加GAMECENTER报错问题及编译ANDROID闪退的解决办法&amp;&amp;CCLOG与CCLOG的区别

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/1035.html 今天备注几个童鞋们可能会遇到的问题: 1. 关于Cocos2dx v1.x版本运行在iphone与Android平台出现图片变白块,尺寸一样.图片纯白问题. 之前出现此问题原因如下: 1.1  CCSprite与CCNode强转之间的问题造成: 1.2  pvr.ccz的资源大小宽高不是正方形的话

Android 手机屏幕适配解决办法_Android

0. 前言 Android的屏幕适配,即使得某一元素在Android不同尺寸.不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题.本文参考了很多前人的博客,并对这一问题做一个总结,力求精简明了. 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52690498 1. 基础概念 (1)屏幕尺寸,即手机对角线的物理尺寸 1英寸 = 2.54cm  常见手机尺寸有5英寸.5.5英寸.6英寸等