android:textScaleX是调节字间距的,它的值是一个float型。默认textView 此属性是使用的是:

Android.internal.R.styleable.TextView_textScaleXsetTextScaleX(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);  }}


更多相关文章

  1. ListView去掉中间的分割线和设置Item之间的间距
  2. Android Studio 打包以及获取数字签名
  3. Android 默认Tab标签大小及间距修改
  4. Android 数字签名
  5. Android 背景透明度设置和设置GridView元素间距
  6. Android限制EditText只能输入中文、英文、数字
  7. Android数字签名的创建
  8. 连载一:如何将如何将Android带入互联网数字家庭?
  9. Android如何进行数字签名与优化

随机推荐

  1. android 系统目录
  2. Android 桌面组件widget
  3. Android——LinearLayout按下(state_pres
  4. Android推送服务(GCM)----GCM Architectu
  5. Android studio3修改打包出來的名字
  6. 谷歌开发工具Android Studio安装使用图文
  7. 【Android】 使用ADT16出现ImageView War
  8. (Android jni) error: base operand of '->
  9. Android事件分发-总结
  10. Android最佳实践之Notification、下拉刷