TextView、AppCompatTextView文字段落居中文末補缺對齊

相信很多開發(fā)者都有這個煩惱洲炊,在Android提供的原生TextView或AppCompatTextView中寫一段文字時,文末都是參差不齊的;一行寫不下就擠到第二行顯示了选浑。這里推薦一段代碼蓝厌,自己也是做個記錄。

原文:https://blog.csdn.net/CSDN472651883/article/details/81057830

/**
 * Author:bobo
 * <p>
 * Create Time:2018/12/7 10:36
 * <p>
 * Email:1245092675@qq.com
 * <p>
 * Describe:左右對齊的textview
 */
public class JustifyTextView extends android.support.v7.widget.AppCompatTextView {
    private int mLineY;
    private int mViewWidth;
    public static final String TWO_CHINESE_BLANK = " ";

    public JustifyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        TextPaint paint = getPaint();
        paint.setColor(getCurrentTextColor());
        paint.drawableState = getDrawableState();
        mViewWidth = getMeasuredWidth();
        String text = getText().toString();
        mLineY = 0;
        mLineY += getTextSize();
        Layout layout = getLayout(); // layout.getLayout()在4.4.3出現(xiàn)NullPointerException
        if (layout == null) {
            return;
        }
        Paint.FontMetrics fm = paint.getFontMetrics();
        int textHeight = (int) (Math.ceil(fm.descent - fm.ascent));
        textHeight = (int) (textHeight * layout.getSpacingMultiplier() + layout.getSpacingAdd()); //解決了最后一行文字間距過大的問題
        for (int i = 0; i < layout.getLineCount(); i++) {
            int lineStart = layout.getLineStart(i);
            int lineEnd = layout.getLineEnd(i);
            float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint());
            String line = text.substring(lineStart, lineEnd);
            if (i < layout.getLineCount() - 1) {
                if (needScale(line)) {
                    drawScaledText(canvas, lineStart, line, width);
                } else {
                    canvas.drawText(line, 0, mLineY, paint);
                }
            } else {
                canvas.drawText(line, 0, mLineY, paint);
            }
            mLineY += textHeight;
        }
    }

    private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) {
        float x = 0;
        if (isFirstLineOfParagraph(lineStart, line)) {
            String blanks = " ";
            canvas.drawText(blanks, x, mLineY, getPaint());
            float bw = StaticLayout.getDesiredWidth(blanks, getPaint());
            x += bw;
            line = line.substring(3);
        }
        int gapCount = line.length() - 1;
        int i = 0;
        if (line.length() > 2 && line.charAt(0) == 12288 && line.charAt(1) == 12288) {
            String substring = line.substring(0, 2);
            float cw = StaticLayout.getDesiredWidth(substring, getPaint());
            canvas.drawText(substring, x, mLineY, getPaint());
            x += cw;
            i += 2;
        }
        float d = (mViewWidth - lineWidth) / gapCount;
        for (; i < line.length(); i++) {
            String c = String.valueOf(line.charAt(i));
            float cw = StaticLayout.getDesiredWidth(c, getPaint());
            canvas.drawText(c, x, mLineY, getPaint());
            x += cw + d;
        }
    }

    private boolean isFirstLineOfParagraph(int lineStart, String line) {
        return line.length() > 3 && line.charAt(0) == ' ' && line.charAt(1) == ' ';
    }

    private boolean needScale(String line) {
        if (line == null || line.length() == 0) {
            return false;
        } else {
            return line.charAt(line.length() - 1) != '\n';
        }
    }
}
text.png

用了幾個框架輪子古徒,事實證明還是上面?zhèn)€自定義控件實用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拓提,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隧膘,更是在濱河造成了極大的恐慌代态,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疹吃,死亡現(xiàn)場離奇詭異蹦疑,居然都是意外死亡,警方通過查閱死者的電腦和手機萨驶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門歉摧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腔呜,你說我怎么就攤上這事叁温。” “怎么了核畴?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵膝但,是天一觀的道長。 經(jīng)常有香客問我谤草,道長跟束,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任丑孩,我火速辦了婚禮冀宴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘温学。我一直安慰自己花鹅,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布枫浙。 她就那樣靜靜地躺著,像睡著了一般古拴。 火紅的嫁衣襯著肌膚如雪箩帚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天黄痪,我揣著相機與錄音紧帕,去河邊找鬼。 笑死,一個胖子當著我的面吹牛是嗜,可吹牛的內(nèi)容都是我干的愈案。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼鹅搪,長吁一口氣:“原來是場噩夢啊……” “哼站绪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丽柿,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恢准,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后甫题,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馁筐,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年坠非,在試婚紗的時候發(fā)現(xiàn)自己被綠了敏沉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡炎码,死狀恐怖盟迟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辅肾,我是刑警寧澤队萤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站矫钓,受9級特大地震影響要尔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜新娜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一赵辕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧概龄,春花似錦还惠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衰粹,卻和暖如春锣光,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铝耻。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工誊爹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓频丘,卻偏偏與公主長得像办成,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搂漠,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容