1. 程式人生 > >Android TextView 設定字間距和行間距

Android TextView 設定字間距和行間距

1.如果您是要設定TextView的行間距 請使用(不用看2了)

android:lineSpacingMultiplier="1.8"
2.如果您是要設定字間距需要自定義控制元件
<pre name="code" class="java">import android.content.Context;
import android.graphics.*;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by mrni-mac on 14-11-25.
 */
public class MyTextView extends TextView {
    private String content;
    private int width;
    private Paint paint;
    private int xPadding;
    private int yPadding;
    private int textHeight;
    private int xPaddingMin;
    int count;
    //記錄每個字的二維陣列
    int[][] position;

    public MyTextView(Context context) {
        super(context);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void setText(String str) {
        width = this.getWidth();
        getPositions(str);
        //重新畫控制元件
        this.invalidate();
    }
    public void init() {

        paint = new Paint();
        paint.setColor(Color.parseColor("#888888"));
        paint.setTypeface(Typeface.DEFAULT);
        paint.setTextSize(dip2px(this.getContext(), 14f));
        Paint.FontMetrics fm = paint.getFontMetrics();// 得到系統預設字型屬性
        textHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);// 獲得字型高度
        //字間距
        xPadding = dip2px(this.getContext(), 4f);
        //行間距
        yPadding = dip2px(this.getContext(), 10f);
        //比較小的字間距(字母和數字應緊湊)
        xPaddingMin = dip2px(this.getContext(), 2f);

    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!TextUtils.isEmpty(content)) {
            for (int i = 0; i < count; i++) {
                canvas.drawText(String.valueOf(content.charAt(i)), position[i][0],position[i][1], paint);
            }
        }
    }


    public void getPositions(String content) {
        this.content = content;
        char ch;
        //輸入點的 x的座標
        int x = 0;
        //當前行數
        int lineNum = 1;
        count = content.length();
        //初始化字型位置陣列
        position=new int[count][2];
        for (int i = 0; i < count; i++) {
            ch =content.charAt(i);
            String str = String.valueOf(ch);

            //根據畫筆獲得每一個字元的顯示的rect 就是包圍框(獲得字元寬度)
            Rect rect = new Rect();
            paint.getTextBounds(str, 0, 1, rect);
            int strwidth = rect.width();
            //對有些標點做些處理
            if (str.equals("《") || str.equals("(")) {
                strwidth += xPaddingMin * 2;
            }
            //當前行的寬度
            float textWith = strwidth;
            //沒畫字前預判看是否會出界
            x += textWith;
            //出界就換行
            if (x > width) {
                lineNum++;// 真實的行數加一
                x = 0;
            } else {
                //回到預判前的位置
                x -= textWith;
            }
            //記錄每一個字的位置
            position[i][0]=x;
            position[i][1]=textHeight * lineNum + yPadding * (lineNum - 1);
            //判斷是否是數字還是字母 (數字和字母應該緊湊點)
            //每次輸入完畢 進入下一個輸入位置準備就緒
            if (isNumOrLetters(str)) {
                x += textWith + xPaddingMin;
            } else {
                x += textWith + xPadding;
            }
        }
        //根據所畫的內容設定控制元件的高度
        this.setHeight((textHeight +yPadding) * lineNum);
    }



    //工具類:判斷是否是字母或者數字
    public boolean isNumOrLetters(String str)
    {
        String regEx="^[A-Za-z0-9_]+$";
        Pattern p=Pattern.compile(regEx);
        Matcher m=p.matcher(str);
        return m.matches();
    }
     // 工具類:在程式碼中使用dp的方法(因為程式碼中直接用數字表示的是畫素)
    public static int dip2px(Context context, float dip) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dip * scale + 0.5f);
    }
}


xml使用如下
 <當前包名.MyTextView
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:id="@+id/video_dec"
                 />
效果如下