Android TextView两端对齐解决办法

发布时间 - 2026-01-11 02:03:40    点击率:

Android TextView两端对齐解决办法

今天遇到一个关于TextView文字两端对齐其实方案,大家都知道原生控件是不能满足我们的需求的,因此需要自定义View

下面看下效果图

package com.example.VerticalMarqueeTextView.view;

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;
import android.view.ViewTreeObserver;
import android.widget.TextView;

/**
 * Created by John on 2017/2/9.
 */

public class WordAlignTextView extends TextView {
  private float textSize;
  private float textLineHeight;
  //顶部
  private int top;
  //y轴
  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;

  private boolean isFirst = true;

  public WordAlignTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
      @Override
      public boolean onPreDraw() {
        initTextInfo();
        return true;
      }
    });
  }

  public WordAlignTextView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public WordAlignTextView(Context context) {
    this(context, null, 0);
  }


  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) && isFirst) {
      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;
      ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.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  # TextView两端对齐  # TextView  # 对其的方法  # 浅谈Android textview文字对齐换行的问题  # Android TextView对齐的两种方法  # Android 中的两端对齐实例详解  # Android实现TextView两端对齐的方法  # Android 控件(button)对齐方法实现详解  # Android 实现文字左右对齐  # 半角  # 全角  # 大家都  # 只需  # 希望能  # 自定义  # 要将  # 谢谢大家  # 能为  # 转换为  # 解决办法  # 多少个  # 换行  # 判断是否  # bottom  # WordAlignTextView  # lines  # left  # char  # lineDrawWords 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站页面设计需要考虑到这些问题  魔方云NAT建站如何实现端口转发?  Laravel如何配置Horizon来管理队列?(安装和使用)  企业网站制作这些问题要关注  Laravel怎么使用artisan命令缓存配置和视图  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel如何使用Eloquent进行子查询  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  高端网站建设与定制开发一站式解决方案 中企动力  如何批量查询域名的建站时间记录?  JavaScript常见的五种数组去重的方式  动图在线制作网站有哪些,滑动动图图集怎么做?  html如何与html链接_实现多个HTML页面互相链接【互相】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  如何在IIS服务器上快速部署高效网站?  如何彻底卸载建站之星软件?  晋江文学城电脑版官网 晋江文学城网页版直接进入  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  轻松掌握MySQL函数中的last_insert_id()  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Python进程池调度策略_任务分发说明【指导】  简历没回改:利用AI润色让你的文字更专业  ,怎么在广州志愿者网站注册?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  微信小程序 require机制详解及实例代码  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel如何自定义分页视图?(Pagination示例)  如何在橙子建站上传落地页?操作指南详解  在线教育网站制作平台,山西立德教育官网?  如何在 Pandas 中基于一列条件计算另一列的分组均值  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Linux安全能力提升路径_长期防护思维说明【指导】  详解CentOS6.5 安装 MySQL5.1.71的方法  C语言设计一个闪闪的圣诞树  Java类加载基本过程详细介绍  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  百度浏览器如何管理插件 百度浏览器插件管理方法  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何在阿里云部署织梦网站?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境