首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android TextView 多樣式文本自動換行:測量文本寬度動態換行

     編輯:程式設計綜合問答

需求

TextView 顯示「標題 + 時間」,標題粗體,時間正常。標題較短時,時間自動換到第二行。

實現思路

  1. 獲取屏幕可用寬度:DisplayMetrics 或 View.getWidth()。
  2. 用 Paint.measureText() 測量標題寬度、時間寬度。
  3. 若 titleWidth + timeWidth > availableWidth,在中間插入 \n。
  4. 構建 SpannableString 設置樣式。

代碼實現

public static CharSequence buildTitleTime(String title, String time, TextView tv) {
    Paint paint = tv.getPaint();
    float availWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight();
    if (availWidth <= 0) availWidth = Resources.getSystem().getDisplayMetrics().widthPixels * 0.9f;
    
    float titleW = paint.measureText(title);
    float timeW = paint.measureText(time);
    
    String text = (titleW + timeW > availWidth) ? title + "\n" + time : title + " " + time;
    
    SpannableString ss = new SpannableString(text);
    ss.setSpan(new StyleSpan(Typeface.BOLD), 0, title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    // 時間灰色
    int timeStart = text.indexOf(time);
    if (timeStart >= 0) {
        ss.setSpan(new ForegroundColorSpan(Color.GRAY), timeStart, timeStart + time.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    return ss;
}

// 使用
tv.setText(buildTitleTime("標題", "2024-01-15 14:30", tv));

進階:StaticLayout 精確換行

StaticLayout layout = new StaticLayout(
    ss, paint, availWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false
);
// layout.getLineCount() > 1 即發生換行

注意

  • 在 onSizeChanged 或 ViewTreeObserver.OnGlobalLayoutListener 中調用,確保寬度已定。
  • 文本內容動態變化時需重新計算。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved