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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值