【Android】TextView設置段落間距

TextView只提供設置行距的方法,沒有提供段落間距的方法,但是提供了一個 SpannableString 類來給TextView設置各種效果,
如圖:

其中一個給文字替換為圖片的效果給我?guī)砹遂`感,

我可以用一個圖片(最后換成一個寬1px,指定高度的透明長方形,xml中畫出來的)來模擬段落間距。

注意畫出來的高度,不能使用 用尺子直接量的值,而要比這個高度要小。
為什么呢,我也不清楚,不過我還是要上個圖,我估計應該是兩行文字之間的line gap的原因。

后臺給我們返回的json中段落區(qū)分符是“\n”,我們先把"\n"替換為"\n\r"

“\n”用來換行,“\r”就是那個將要被替換的字符了(為什么要用\r呢,陰差陽錯啦,后來發(fā)現\r挺合適的,也不會重復);最后就是用SpannableString來處理文字了。

/**
     * 設置TextView段落間距
     *
     * @param context          上下文
     * @param tv               給誰設置段距,就傳誰
     * @param content          文字內容
     * @param paragraphSpacing 請輸入段落間距(單位dp)
     * @param lineSpacingExtra xml中設置的的行距(單位dp)
     */
    public static void setParagraphSpacing(Context context, TextView tv, String content, int paragraphSpacing, int lineSpacingExtra) {
        if (!content.contains("\n")) {
            tv.setText(content);
            return;
        }
        content = content.replace("\n", "\n\r");

        int previousIndex = content.indexOf("\n\r");
        //記錄每個段落開始的index,第一段沒有,從第二段開始
        List<Integer> nextParagraphBeginIndexes = new ArrayList<>();
        nextParagraphBeginIndexes.add(previousIndex);
        while (previousIndex != -1) {
            int nextIndex = content.indexOf("\n\r", previousIndex + 2);
            previousIndex = nextIndex;
            if (previousIndex != -1) {
                nextParagraphBeginIndexes.add(previousIndex);
            }
        }
        //獲取行高(包含文字高度和行距)
        float lineHeight = tv.getLineHeight();

        //把\r替換成透明長方形(寬:1px,高:字高+段距)
        SpannableString spanString = new SpannableString(content);
        Drawable d = ContextCompat.getDrawable(context, R.drawable.paragraph_space);
        float density = context.getResources().getDisplayMetrics().density;
        //int強轉部分為:行高 - 行距 + 段距
        d.setBounds(0, 0, 1, (int) ((lineHeight - lineSpacingExtra * density) / 1.2 + (paragraphSpacing - lineSpacingExtra) * density));

        for (int index : nextParagraphBeginIndexes) {
            // \r在String中占一個index
            spanString.setSpan(new ImageSpan(d), index + 1, index + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        tv.setText(spanString);
    }

那個透明的長方形很簡單,隨手一畫就有了。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="@color/transparent"/>
</shape>

下邊這個就是替換后的效果,只不過這時候為了展示替換效果,那個長方形還是用了個orange色。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 字符串資源里變量替換 Android開發(fā)中是拒絕硬編碼的,我們可能會把一些字符串放在xml中當作資源使用,假設有如...
    醉馬當前闖閱讀 13,746評論 2 44
  • 前言 工作找完了,已經干了兩個星期。雖然經常加班,不過相比之前的工作,現在過得更加充實、更有意義。現在有點空閑時間...
    帶心情去旅行閱讀 73,081評論 42 237
  • ¥開啟¥ 【iAPP實現進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,509評論 0 17
  • 故事似乎到這里就會結束,我慢慢變得端莊穩(wěn)重,與各種各樣的女子打交道,平衡著各種勢力,每天略施粉黛,盈盈一笑,有著外...
    深巷梨花閱讀 143評論 0 0
  • 你說生活很安逸 而我正準備逃離 我害怕在春天睡去 雙腳長出根須 歲月如流沙般靜謐 更怕鳥籠鎖住天空 把夢的羽翼 溫...
    風紫_Rae閱讀 161評論 0 0