TextView設置字間距和行間距

android:textScaleX是調節字間距的,它的值是一個float型。默認textView 此屬性是使用的是:

Android.internal.R.styleable.TextView_textScaleX
setTextScaleX(a.getFloat(attr, 1.0f));

設置TextView的行間距和行間距的倍數

android:lineSpacingExtra  
android:lineSpacingMultiplier

設置字間距需要自定義控件

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);
  }
}


發佈了89 篇原創文章 · 獲贊 6 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章