Android TextView显示文字对齐
有时候利用android的TextView显示中文跟数字的组合会对不齐,如下面截图,文字还没有到达屏幕右边就开始换行了
为了解决这个文字,自己子定义了一个TextView的子类来实现,具体步骤如下:
1.自定义AlignTextView继承系统TextView
import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.text.TextUtils; import android.util.AttributeSet; import android.widget.TextView; import java.util.ArrayList; /** * Created by crab on 15-3-16. * 解决中文跟数字在一起的是时候textView显示不正确问题 */ public class AlignTextView extends TextView { //行间距 private float mLineGap = 0.0f; private Paint mPaint; private ArrayList<String> mTexts = new ArrayList<String>(); public AlignTextView(Context context) { super(context); init(); } public AlignTextView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlignTextView); mLineGap = typedArray.getDimension(R.styleable.AlignTextView_lineSpacingExtra, 0.0f); float textSize = typedArray.getDimension(R.styleable. AlignTextView_textSize, 24.0f); int textColor = typedArray.getColor(R.styleable. AlignTextView_textColor, Color.WHITE); // 构建paint对象 mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(textColor); mPaint.setTextSize(textSize); typedArray.recycle(); init(); } public AlignTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlignTextView); mLineGap = typedArray.getDimension(R.styleable.AlignTextView_lineSpacingExtra, 0.0f); float textSize = typedArray.getDimension(R.styleable. AlignTextView_textSize, 24.0f); int textColor = typedArray.getColor(R.styleable. AlignTextView_textColor, Color.WHITE); // 构建paint对象 mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(textColor); mPaint.setTextSize(textSize); typedArray.recycle(); init(); } private void init() { mTexts.clear(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); String text = getText().toString(); if (!TextUtils.isEmpty(text)) { mTexts.clear(); int iStart = 0; int w = 0; int line = 0; Paint paint=mPaint; for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); float[] charWidth = new float[1]; String charStr = String.valueOf(ch); paint.getTextWidths(charStr, charWidth); if (ch == '\n') { String subText = text.substring(iStart, i); mTexts.add(line, subText); line++; iStart = i + 1; w = 0; } else { w += ((int) Math.ceil(charWidth[0])); if (w > width) { String subText = text.substring(iStart, i); mTexts.add(line, subText); iStart = i; w = 0; line++; } else { if (i == text.length() - 1) { String subText = text.substring(iStart, i+1); mTexts.add(line, subText); } } } } Paint.FontMetrics fontMetrics=paint.getFontMetrics(); float fontHeight=fontMetrics.bottom-fontMetrics.top; int size=mTexts.size(); float textHeight=0.0f; for(int i=0;i<size;i++){ if(i==0){ textHeight+=fontHeight; }else{ textHeight+=(fontHeight+mLineGap); } } setMeasuredDimension(width,(int)textHeight); }else{ mTexts.clear(); } } @Override protected void onDraw(Canvas canvas) { int size=mTexts.size(); Paint paint=mPaint; Paint.FontMetrics fontMetrics=paint.getFontMetrics(); float fontHeight=fontMetrics.bottom-fontMetrics.top; for(int i=0;i<size;i++){ String text=mTexts.get(i); canvas.translate(0,i*(mLineGap+fontHeight)); canvas.drawText(text,0.0f,0-fontMetrics.top,paint); canvas.translate(0,-i*(mLineGap+fontHeight)); } } }
2.res/values/attrs.xml文件中增加如下属性
<declare-styleable name="AlignTextView"> <attr name="lineSpacingExtra" format="dimension"/> <attr name="textSize" format="dimension"/> <attr name="textColor" format="reference|color"/> </declare-styleable>
3.在布局文件中使用自定义的View
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:algnText="http://schemas.android.com/apk/res-auto" android:background="#FFFFFF" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="1.系统TextView显示文字效果如下:" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:layout_marginTop="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:lineSpacingExtra="5dp" android:textSize="16sp" android:textColor="#FF00FF00" android:text="我们已将验证码短信发送到你的手机123****4567,超过60秒没收到请点击重发" /> <TextView android:layout_marginTop="10dp" android:text="2.自定义TextView显示文字效果如下:" android:layout_width="match_parent" android:layout_height="wrap_content"/> <com.example.crab.mycameratest.AlignTextView android:layout_marginTop="10dp" android:text="我们已将验证码短信发送到你的手机123****4567,超过60秒没收到请点击重发" algnText:lineSpacingExtra="5dp" algnText:textSize="16sp" algnText:textColor="#FF00FF00" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。