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>



  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。