热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

AndroidAutoWrapTextView中英文排版问题的解决方法

这篇文章主要给大家介绍了关于AndroidAutoWrapTextView中英文排版问题的解决方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。

前言

最近项目有新需求,UED给了个卡券密码的UI样式,如图:


我一看很简单啊,一个TextView解决问题,然后做好以后在模拟器里一看.....


纳尼,这个时候才想起来,TextView 中英文在一起会有排版问题,那怎么解决呢......

思路

刚开始的想法是一个字符一个字符的去绘制,绘制到最右边的临界点就换行绘制,结果实践以后发现不同的字符之间的间距不一样,显示会非常凌乱,又没有什么好的方案解决这个间距问题,所以这个方案pass;单个字符绘制不行那就一行一行绘制,根据View的长度把文本拆分成N行,然后一行一行的绘制。

实现

首先创建一个继承自View的AutoWrapTextView

public class AutoWrapTextView extends View {

}

来看看它的构造方法

public AutoWrapTextView(Context context, AttributeSet attrs) {
  super(context, attrs);

  init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
  initStyle(context, attrs);
  initPaint();
}

init方法里分别调用了initStyle方法和initPaint方法;

initStyle方法主要解析自定义的属性

 private void initStyle(Context context, AttributeSet attrs) {
  TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AutoWrapTextViewStyle);
  mPaddingLeft = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingLeft, 0);
  mPaddingRight = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingRight, 0);
  mPaddingTop = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingTop, 0);
  mPaddingBottom = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingBottom, 0);

  mTextColor = typedArray.getColor(R.styleable.AutoWrapTextViewStyle_textColor, Color.BLACK);
  mTextSize = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_textSize, 50);
  mLineSpacingExtra = typedArray.getInteger(R.styleable.AutoWrapTextViewStyle_lineSpacingExtra, 7);

  typedArray.recycle();
 }

属性名含义都很明显不用过多解释,initPaint方法就是初始化一个文本画笔

 private void initPaint() {
  mTextPaint = new TextPaint();
  mTextPaint.setAntiAlias(true);
  mTextPaint.setTextSize(mTextSize);
  mTextPaint.setColor(mTextColor);
  mTextPaint.setTextAlign(Paint.Align.LEFT);
 }

接下来我们看看设置文本的方法setText方法

 public void setText(String text) {
  if (TextUtils.isEmpty(text)) return;

  //把文本转换成Char数组
  mTextCharArray = text.toCharArray();
  requestLayout();
 }

首先把文本转换成Char数组,然后循环数组把整个文本拆分成N行文本,下面来看看核心方法splitText方法

 private void splitText(int heightMode) {
  if (mTextCharArray == null) return;

  mSplitTextList = new ArrayList<>();
  mSingleTextWidth = getMeasuredWidth() - mPaddingLeft - mPaddingRight;
  int currentSingleTextWidth = 0;
  StringBuffer lineStringBuffer = new StringBuffer();
  for (int i = 0, length = mTextCharArray.length; i  mSingleTextWidth) {
    mSplitTextList.add(lineStringBuffer.toString());
    lineStringBuffer = new StringBuffer();
    currentSingleTextWidth = 0;
    i--;
   } else {
    lineStringBuffer.append(textChar);
    if (i == length - 1) mSplitTextList.add(lineStringBuffer.toString());
   }
  }

  int textHeight = 0;
  mSplitTextRectArray = new Rect[mSplitTextList.size()];
  for (int m = 0, length = mSplitTextList.size(); m 

首先创建一个属性名为mSplitTextList的List集合用来存放拆分的文本;

mSingleTextWidth 为单行文本显示的宽度;

currentSingleTextWidth 为当前一行累计计算的宽度;

然后开始循环Char数组,getSingleCharWidth方法就是计算单个Char的宽度;

如果currentSingleTextWidth 小于 mSingleTextWidth 就把Char添加到lineStringBuffer 当中,如果是最后一个Char就直接把lineStringBuffer添加到mSplitTextList集合当中

如果currentSingleTextWidth 大于 mSingleTextWidth,就把lineStringBuffer添加到mSplitTextList集合当中,重新给lineStringBuffer赋值,currentSingleTextWidth 归0;

循环结束以后拆分好的文本就都添加到mSplitTextList集合当中了。

拆分完成以后循环mSplitTextList集合,得到每一行文本的Rect值,绘制文本的时候会用到,然后设置View的宽高。

接下来就是绘制方法drawText

 public void drawText(Canvas canvas) {
  if (mSplitTextList == null || mSplitTextList.size() == 0) return;

  int marginTop = getTopTextMarginTop();
  for (int m = 0, length = mSplitTextList.size(); m 

首先得到第一行文本距离顶部的高度marginTop,然后循环文本绘制每一行文本内容。

效果图

我们来看下最后的效果


结束语

至此整个类的逻辑分析就结束了,想看完整源码的可以移步:https://github.com/chenpengfei88/AutoWrapTextView或者通过本地进行下载:http://xiazai.jb51.net/201705/yuanma/AutoWrapTextView(jb51.net).rar

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


推荐阅读
  • 本文基于对相关论文和开源代码的研究,详细介绍了LOAM(激光雷达里程计与建图)的工作原理,并对其关键技术进行了分析。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
author-avatar
xao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有