`

[Android]TextView实现分散对齐(两端对齐)

阅读更多

TextView是个特别基础的Android控件,只要有文本基本就少不了它。但是最近在项目开发的过程中我发现TextView存在很多局限 性,其中最令我头疼的就是TextView文本排版方面的问题。我们都知道在word中文字对齐方式有靠左、靠右、居中、分散对齐等,但是 TextView中就偏偏没有分散对齐这个属性设置。这就导致了TextView中一段文字会出现右边参差不齐的问题,中文由于每个字等宽看起来还不是特 别糟糕,英文看起来就比较过分了。

为了解决这个问题,一个常用的解决方法是在TextView内使用html来 实现文本样式的设定,或者干脆放弃TextView而使用WebView来实现。但是,凡事都应该敢于解决问题,而不是回避问题,我相信即使仅用 TextView一样是可以实现,后来我发现stackoverflow上有个回答提供了一种思路,我按照这种思路果然实现了TextView文本的分散 对齐。 以下是我的实现过程:

MainActivity中:

 

Display display = getWindowManager().getDefaultDisplay();           
DisplayMetrics dm = new DisplayMetrics();           
display.getMetrics(dm);           
width = dm.widthPixels;                       
//根据屏幕调整文字大小
mArticleTextView.setLineSpacing(0f, 1.5f);
mArticleTextView.setTextSize(8*(float)width/320f);                       
//设置TextView
mArticleTextView.setText("TextView需要显示的文本内容");   
           
TextJustification.justify(mArticleTextView,mArticleTextView.getWidth()); 首先设置TextView的显示字体大小和文本内容,这里设置字体大小根据屏幕尺寸调整。然后调用自定义的类Textustification中的 justify方法来实现TextView的分散对齐,两个参数分别是TextView控件以及控件的宽度。

自定义的类TextJustification内容如下:


import java.util.ArrayList;

import android.graphics.Paint;
import android.text.TextUtils;
import android.widget.TextView;
import android.widget.TextView.BufferType;

public class TextJustification {

    public static void justify(TextView textView, float contentWidth) {
        String text=textView.getText().toString();
        String tempText;
        String resultText = "";
        Paint paint=textView.getPaint();

        ArrayList<String> paraList = new ArrayList<String>();       
        paraList = paraBreak(text);       
        for(int i = 0; i<paraList.size(); i++) {           
            ArrayList<String> lineList=lineBreak(paraList.get(i).trim(),paint,contentWidth);           
            tempText = TextUtils.join(" ", lineList).replaceFirst("\\s*", "");           
            resultText += tempText.replaceFirst("\\s*", "") + "\n";       
        }               
       
        textView.setText(resultText);
    }
    //分开每个段落
    public static ArrayList<String> paraBreak(String text, TextView textview) {
        ArrayList<String> paraList = new ArrayList<String>();
        String[] paraArray = text.split("\\n+");
           for(String para:paraArray) {
               paraList.add(para);
        }
        return paraList;
    }

    //分开每一行,使每一行填入最多的单词数
    private static ArrayList<String> lineBreak(String text, Paint paint, float contentWidth){
        String [] wordArray=text.split("\\s");
        ArrayList<String> lineList = new ArrayList<String>();
        String myText="";

        for(String word:wordArray){
            if(paint.measureText(myText+" "+word)<=contentWidth)
                myText=myText+" "+word;
            else{
                int totalSpacesToInsert=(int)((contentWidth-paint.measureText(myText))/paint.measureText(" "));
                lineList.add(justifyLine(myText,totalSpacesToInsert));
                myText=word;
            }
        }
        lineList.add(myText);
        return lineList;
    }
    //已填入最多单词数的一行,插入对应的空格数直到该行满
    private static String justifyLine(String text,int totalSpacesToInsert){
        String[] wordArray=text.split("\\s");
        String toAppend=" ";

        while((totalSpacesToInsert)>=(wordArray.length-1)){
            toAppend=toAppend+" ";
            totalSpacesToInsert=totalSpacesToInsert-(wordArray.length-1);
        }
        int i=0;
        String justifiedText="";
        for(String word:wordArray){
            if(i<totalSpacesToInsert)
                justifiedText=justifiedText+word+" "+toAppend;

            else               
                justifiedText=justifiedText+word+toAppend;

            i++;
        }

        return justifiedText;
    }

 
   


}这个类完成了TextView内部文字的排版工作,主要分3个步骤:
1、将一篇文章按段落分成若干段(如果只有一段可以略去该步骤);

2、将每一段的文字拆分成各个单词,然后根据控件长度确定每一行最多可以填入的单词数,并且算出排满该行还需要填入几个空格。

3、填入空格。

注意代码中用到了一些正则表达式进行文章内容操作,若不清楚可以自行搜索含义。

 

这样就完成了TextView内部文字分散对齐的排版过程。总结一下,这样操作还是有点蛋疼的,虽然不算复杂,但还是对文本内容进行了完全的重新处 理;并且仅是使用了已有的文本和空格数来实现对齐,并不是严格的分散对齐。但不管怎么说,终究是用TextView自身的操作来实现了,并且效果还算不 错。

android百度网盘教程

 

分享到:
评论

相关推荐

    Android TextView 换行不对齐的问题

    1. **自定义`TextView`**: 创建一个继承自`TextView`的自定义类,重写`onDraw()`方法,自行实现对齐逻辑。你可以遍历每一行,测量每个字符宽度,并计算出合适的偏移量,然后调整画布坐标来实现对齐。 2. **使用第三...

    textview实现word分散对齐功能

    textview实现word分散对齐功能

    Android TextView两端对齐解决办法

    在 Android 中,TextView 控件不能直接实现两端对齐的效果,因此需要自定义 View 来实现该功能。 在解决方案中,我们可以使用自定义的 WordAlignTextView 类,该类继承自 TextView,并重写了其方法以实现两端对齐的...

    Android TextView实现垂直滚动效果的方法

    在Android开发中,当需要在一个TextView中展示大量文本,而屏幕空间有限时,可以使用TextView的垂直滚动功能来实现文本的连续显示。本篇文章将详细讲解如何在Android中实现TextView的垂直滚动效果。 首先,要开启...

    安卓textview左右对齐,自适配间距

    在Android开发中,TextView是用于显示单行或多行文本的常用组件。然而,当TextView包含多行文本并需要左右对齐时,由于不同设备屏幕...通过学习和理解这些代码,可以更好地掌握在Android中实现TextView左右对齐的技巧。

    自定义textview显示文字对齐到最右侧才换行

    标题和描述提到的问题,即如何实现“自定义TextView显示文字对齐到最右侧才换行”,是一个典型的布局定制问题。为了解决这个问题,我们需要创建一个自定义的TextView,并覆盖其默认的换行行为。 首先,创建一个新的...

    MyTextview

    本篇文章将深入探讨`TextView`的水平分散对齐(Horizontal Spacing)和竖直分散对齐(Vertical Spacing)的概念,以及如何实现这两种对齐方式。 首先,我们来理解一下`TextView`的基本用法。在XML布局文件中,我们...

    textview自定义左右对齐

    当需要实现类似Word文档中的左右对齐效果时,即两端对齐(justify)效果,我们就需要自定义`TextView`。这个自定义过程通常涉及到对源码的修改或扩展新的类。以下将详细讲解如何实现`TextView`的左右对齐功能。 ...

    新两端对齐的TextView

    "新两端对齐的TextView"项目正是针对这种需求,提供了在Android Studio中实现两端对齐文本的功能。 在标准的Android SDK中,原生的TextView并不直接支持文本两端对齐。不过,开发者可以利用一些技巧或第三方库来...

    Android TextView 去掉自适应默认的fontpadding的实现方法

    Android TextView 去掉自适应默认的fontpadding的实现方法 最近在项目中使用textview时发现在使用Android:layout_height=”wrap_content”这个属性设置后,textview会有默认的padding,也就是fontpadding。这样就会...

    安卓textView相关-一种简单粗暴的方式实现Android文本域左右对齐.rar

    本资源“安卓textView相关-一种简单粗暴的方式实现Android文本域左右对齐.rar”聚焦于如何在TextView中实现文本的左右对齐,这对于创建美观且用户体验良好的界面至关重要。 通常,TextView的文本对齐方式有以下几种...

    解决Android原生TextView显示中英文等末尾参差不齐问题

    首先,我们要知道TextView的对齐方式主要有左对齐、右对齐、居中和两端对齐。在默认情况下,中文和英文字符的宽度是不同的,中文字符通常占据固定宽度,而英文字符则根据其形状占用不同宽度。这种差异在显示混合文本...

    在Android中用textview实现简单的小说分页

    本文将深入探讨如何使用TextView在Android环境中实现这一功能,同时考虑到字体大小的调整以及字符串处理的灵活性。 首先,TextView是Android SDK中一个核心组件,它用于显示单行或多行文本。在我们的场景中,...

    Android textview实现led效果的字体

    如果我们的应用需要显示时间,可能首先想到大街上LED显示的绿色的发光字体, 想到 使用时钟控件显示时间,这种效果,我们用 TextView 就可以实现。具体看博客说明:编辑文章 - 博客频道 - CSDN.NET ...

    android TextView android TextView

    其中,`TextView`和`ListView`是非常重要的两个组件。它们不仅用于简单的文本展示,还可以用来构建复杂的用户界面。本文主要针对`ListView`的`transcriptMode`属性进行详细介绍,并给出具体的实现代码。 #### 一、`...

    Android通过textview设置状态

    在Android中,这通常通过使用Selector来实现。Selector是一种Drawable对象,它可以定义多种状态并决定在特定状态下显示哪种图像或颜色。 首先,我们需要了解TextView的状态列表。在Android中,TextView可以有以下几...

    android TextView 支持CSS样式

    ### Android TextView 支持CSS样式详解 #### 一、引言 在Android开发过程中,为了增强界面的表现力和可维护性,开发者常常需要利用到HTML和CSS的技术来丰富`TextView`的内容展示。虽然原生的Android SDK并没有直接...

    Android TextView实现点击展开动画效果(转)

    在Android开发中,TextView是用于显示文本的基本组件。在许多应用中,我们可能希望实现一个功能,当用户点击TextView时,文本能展开显示全部内容,同时伴随着优雅的动画效果。这篇博客“Android TextView实现点击...

Global site tag (gtag.js) - Google Analytics