android字符串两端对齐,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);

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值