欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现TextView两端对齐的方法

程序员文章站 2023-12-21 14:44:22
android中的textview控件默认是做不到两端对齐的,都是左对齐。可能的原因是安卓默认数字、字母不能为第一行以后每行的开头字符,因为数字、字母为半角字符,还有就是文...

android中的textview控件默认是做不到两端对齐的,都是左对齐。可能的原因是安卓默认数字、字母不能为第一行以后每行的开头字符,因为数字、字母为半角字符,还有就是文字中的英文字符占用1个字节,而一个汉字占用两个字节。下面我就介绍下实现两端对齐的原理:

  • 1、测量一个中文汉字所占用的宽度
  • 2、根据textview的宽度和一个汉字所占用的宽度以及字符之间的间隔计算出总行数。
  • 3、根据padding和margin以及行高计算出textview的总高度。
  • 4、绘制每一行的每一个字符

效果如下:

Android实现TextView两端对齐的方法

具体代码如下:

package com.wedroid.framework.module.ui;

import android.content.context;
import android.graphics.canvas;
import android.graphics.paint;
import android.text.textpaint;
import android.text.textutils;
import android.util.attributeset;
import android.view.viewgroup.marginlayoutparams;
import android.view.viewtreeobserver.onpredrawlistener;
import android.widget.textview;

public class wedroidaligntextview extends textview {

  private boolean first = true;

  public wedroidaligntextview(context context, attributeset attrs, int defstyle) {
    super(context, attrs, defstyle);
    getviewtreeobserver().addonpredrawlistener(new onpredrawlistener() {
      @override
      public boolean onpredraw() {
        inittextinfo();
        return true;
      }
    });
  }

  public wedroidaligntextview(context context, attributeset attrs) {
    this(context, attrs, 0);
  }

  public wedroidaligntextview(context context) {
    this(context, null, 0);
  }

  private float textsize;
  private float textlineheight;
  private int top;
  private int y;
  private int lines;
  private int bottom;
  private int right;
  private int left;
  private int linedrawwords;
  private char[] textchararray;
  private float singlewordwidth;

  private float linespacingextra;

  public void inittextinfo() {
    textsize = gettextsize();
    textlineheight = getlineheight();
    left = 0;
    right = getright();
    y = gettop();
    // 要画的宽度
    int drawtotalwidth = right - left;
    string text = gettext().tostring();
    if (!textutils.isempty(text) && first) {
      textchararray = text.tochararray();
      textpaint mtextpaint = new textpaint(paint.anti_alias_flag);
      mtextpaint.density = getresources().getdisplaymetrics().density;
      mtextpaint.settextsize(textsize);
      // 一个单词的的宽度
      singlewordwidth = mtextpaint.measuretext("一") + linespacingextra;
      // 一行可以放多少个字符
      linedrawwords = (int) (drawtotalwidth / singlewordwidth);
      int length = textchararray.length;
      lines = length / linedrawwords;
      if ((length % linedrawwords) > 0) {
        lines = lines + 1;
      }
      first = false;
      marginlayoutparams layoutparams = (marginlayoutparams) getlayoutparams();
      int totalheight = (int) (lines*textlineheight+textlineheight*2 + getpaddingbottom()+getpaddingtop()+layoutparams.bottommargin+layoutparams.topmargin);
      setheight(totalheight);
    }
  }

  @override
  protected void ondraw(canvas canvas) {
    bottom = getbottom();
    int drawtotalline = lines;

    if(maxline!=0&&drawtotalline>maxline){
      drawtotalline = maxline;
    }

    for (int i = 0; i < drawtotalline; i++) {
      try {
        int length = textchararray.length;
        int mleft = left;
        // 第i+1行开始的字符index
        int startindex = (i * 1) * linedrawwords;
        // 第i+1行结束的字符index
        int endtextindex = startindex + linedrawwords;
        if (endtextindex > length) {
          endtextindex = length;
          y += textlineheight;
        } else {
          y += textlineheight;
        }
        for (; startindex < endtextindex; startindex++) {
          char c = textchararray[startindex];
//         if (c == ' ') {
//           c = '\u3000';
//         } else if (c < '\177') {
//           c = (char) (c + 65248);
//         }
          canvas.drawtext(string.valueof(c), mleft, y, getpaint());
          mleft += singlewordwidth;
        }
      } catch (exception e) {
        e.printstacktrace();
      }
    }
  }

  int maxline;

  public void setmaxlines(int max){
    this.maxline = max;
  }

  public void setlinespacingextra(int linespacingextra){
    this.linespacingextra = linespacingextra;
  }

   /** 
   * 判断是否为中文 
   * @return 
   */ 
  public static boolean containchinese(string string){ 
    boolean flag = false; 
    for (int i = 0; i < string.length(); i++) { 
      char c = string.charat(i); 
      if ((c >= 0x4e00) && (c <= 0x9fa5)) { 
        flag = true; 
      } 
    } 
    return flag; 
  }


  public static string todbc(string input) {
    // 导致textview异常换行的原因:安卓默认数字、字母不能为第一行以后每行的开头字符,因为数字、字母为半角字符
    // 所以我们只需要将半角字符转换为全角字符即可
    char c[] = input.tochararray();
    for (int i = 0; i < c.length; i++) {
      if (c[i] == ' ') {
        c[i] = '\u3000';
      } else if (c[i] < '\177') {
        c[i] = (char) (c[i] + 65248);
      }
    }
    return new string(c);
  }

}

希望本文所述对大家学习android程序设计有所帮助。

上一篇:

下一篇: