解决android自带textview右侧文字不能对齐的问题

 1 package com.sixin.view;
 2
 3 import android.content.Context;
 4 import android.graphics.Canvas;
 5 import android.text.Layout;
 6 import android.text.StaticLayout;
 7 import android.text.TextPaint;
 8 import android.util.AttributeSet;
 9 import android.widget.TextView;
10
11 /**
12  * 能够自动修正的textview,解决android自带textview右侧文字不能对齐的问题
13  */
14 public class JustifyTextView extends TextView {
15
16     private int mLineY;
17     private int mViewWidth;
18
19     public JustifyTextView(Context context, AttributeSet attrs) {
20         super(context, attrs);
21     }
22
23     @Override
24     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
25         super.onLayout(changed, left, top, right, bottom);
26     }
27
28     @Override
29     protected void onDraw(Canvas canvas) {
30         TextPaint paint = getPaint();
31         paint.setColor(getCurrentTextColor());
32         paint.drawableState = getDrawableState();
33         mViewWidth = getMeasuredWidth();
34         String text = (String) getText();
35         mLineY = 0;
36         mLineY += getTextSize();
37         Layout layout = getLayout();
38         for (int i = 0; i < layout.getLineCount(); i++) {
39             int lineStart = layout.getLineStart(i);
40             int lineEnd = layout.getLineEnd(i);
41             String line = text.substring(lineStart, lineEnd);
42
43             float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint());
44             if (needScale(line)) {
45                 drawScaledText(canvas, lineStart, line, width);
46             } else {
47                 canvas.drawText(line, 0, mLineY, paint);
48             }
49
50             mLineY += getLineHeight();
51         }
52     }
53
54     private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) {
55         float x = 0;
56         if (isFirstLineOfParagraph(lineStart, line)) {
57             String blanks = "  ";
58             canvas.drawText(blanks, x, mLineY, getPaint());
59             float bw = StaticLayout.getDesiredWidth(blanks, getPaint());
60             x += bw;
61
62             line = line.substring(3);
63         }
64
65         float d = (mViewWidth - lineWidth) / line.length() - 1;
66         for (int i = 0; i < line.length(); i++) {
67             String c = String.valueOf(line.charAt(i));
68             float cw = StaticLayout.getDesiredWidth(c, getPaint());
69             canvas.drawText(c, x, mLineY, getPaint());
70             x += cw + d;
71         }
72     }
73
74     private boolean isFirstLineOfParagraph(int lineStart, String line) {
75         return line.length() > 3 && line.charAt(0) == ‘ ‘ && line.charAt(1) == ‘ ‘;
76     }
77
78     private boolean needScale(String line) {
79         if (line.length() == 0) {
80             return false;
81         } else {
82             return line.charAt(line.length() - 1) != ‘\n‘;
83         }
84     }
85
86 }
时间: 2024-10-01 02:45:48

解决android自带textview右侧文字不能对齐的问题的相关文章

解决android自带蓝牙不能发送接收某些文件类型

最近,遇到一个蓝牙的bug,刚开始以为不能发送大的文件,最后追踪代码发现,是不能发送某些文件类型的文件的. 默认之支持所有图片,所有视频,所有音频,文本类型,html,zip,excel,word,ppt,pdf等类型. 要想让其支持你要发送/接收的文件类型需要在相应地方添加相应的类型. 发送的文件类型,需要修改package/app/bluetooth目录下的AndroidManifest.xml文件的<data android:mimeType="" />, 添加相应的

批量解决 word/wps 中公式和文字不对齐的问题

完美解决Word或wps中中公式和文字对不齐的问题 在 word 的各个版本中,当公式和字符同时出现时,尤其是发生公式的拷贝粘贴时,公式往往会出现上飘或下移的情况,这里给出一个简单易行的解决方案: 全选 ? 字体 ? 字符间距 ? 位置 ? 标准: 段落 ? 中文版式 ? 文本对齐方式 ? 居中: 再分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 原文地址:ht

Android 自绘TextView解决提前换行问题,支持图文混排

先看下效果图: 上面是MTextView,下面是默认的TextView. 一.原因 用最简单的全英文句子为例,如果有一个很长的单词,这一行剩余的空间显示不下了,那么规则就是不打断单词,而是把整个单词丢到下一行开始显示.这样本来没有错.一是咱们中国人都是方块字,怎么都放得下,不存在英文的这个问题.所以不习惯那个排版.二是如果TextView里面有图片,如图,不知道判断单词的代码是怎么弄得,总之它觉得最后一个啦字和后面的一串表情应该是一个整体,不能分开,就一起丢到第二行了,也就造成了这种难看的排版.

Android TextView自动换行文字排字参差不齐的原因及处理

Android TextView自动换行文字排版参差不齐的原因及处理 转自: TextView会自动换行,而且排版文字参差不齐.查了下资料,总结原因如下: 1.半角字符与全角字符混乱所致:这种情况一般就是汉字与数字.英文字母混用 解决方法一: 将textview中的字符全角化.即将所有的数字.字母及标点全部转为全角字符,使它们与汉字同占两个字节,这样就可以避免由于占位导致的排版混乱问题了. 半角转为全角的代码如下,只需调用即可.public static String ToDBC(String

Android TextView 实现文字大小不同和文字颜色不同

效果图如下: 关键代码如下: StringBuffer sb = new StringBuffer(); if(day > 0) { sb.append("<a href=\"1\">"); sb.append(""+day); sb.append("</a>"); sb.append(""+Global.getString(R.string.unit_Day2)); } sb

Android之同一个TextView设置不同样式的文字

需求分析: 很多时候,我们需要在视图中显示不同样式的文字,但是为了减少viewgroup层级,不想新增很多个TextView控件来实现不同样式的文字. 那么有没有一种方式能够在同一个TextView控件中实现多种自定义的样式的文字呢? 答案是肯定的,下面就让我们来做一个此问题的实践实验. 实践过程: 首先我们在布局xml文件中定义了三个TextView控件,它们的定义如下: <TextView android:id="@+id/annualized_Rate_text" andr

android如何写一个循环文字滚动的TextView

效果图: 在layout中这样来声明: <com.kaixin001.view.ScrollText android:id="@+id/news_statustxt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dp" android:paddingRight="1

(九)android中通过selector设置TextView的文字选中和正常时候的颜色

通过selector设置TextView的文字选中和正常时候的颜色的步骤如下所示: 1.在res下面建个文件夹color,color文件夹下面建个tv_text_color_selector.xml,tv_text_color_selector.xml中的代码如下所示: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.androi

android中给TextView或者Button的文字添加阴影效果

1在代码中添加文字阴影 TextView 有一个方法 /** * Gives the text a shadow of the specified radius and color, the specified * distance from its normal position. * * @attr ref android.R.styleable#TextView_shadowColor * @attr ref android.R.styleable#TextView_shadowDx *