{"id":1510,"date":"2021-09-23T13:33:30","date_gmt":"2021-09-23T05:33:30","guid":{"rendered":"https:\/\/badgameshow.com\/fly\/?p=1510"},"modified":"2021-09-23T13:34:04","modified_gmt":"2021-09-23T05:34:04","slug":"android-spannablestringbuilder-%e7%94%a8%e6%b3%95","status":"publish","type":"post","link":"https:\/\/badgameshow.com\/fly\/android-spannablestringbuilder-%e7%94%a8%e6%b3%95\/","title":{"rendered":"Android SpannableStringBuilder \u7528\u6cd5"},"content":{"rendered":"<h1>Android SpannableStringBuilder \u7528\u6cd5<\/h1>\n<h5>SpannableStringBuilder\uff0c\u548cString\u4e00\u6a23\u90fd\u662f\u4e00\u7a2e\u5b57\u4e32\u578b\u5225\u3002\u4e0d\u540c\u7684\u662fSpannableString\u53ef\u4ee5\u901a\u904e\u4f7f\u7528\u5176\u65b9\u6cd5setSpan\u65b9\u6cd5\u5be6\u73fe\u5b57\u4e32\u5404\u7a2e\u6587\u5b57\u7684\u6a23\u5f0f\u3002\u4f8b\u5982:\u6bb5\u843d\u6587\u5b57\u3001\u5e95\u7dda\u3001\u6587\u5b57\u653e\u5927\u3001\u80cc\u666f\u984f\u8272\u3001\u6587\u5b57\u984f\u8272\u3001\u5716\u7247\u585e\u5165\u6587\u5b57\u3001\u522a\u9664\u7dda\u3001\u6bdb\u73bb\u7483\u3001\u6bb5\u843d\u5713\u9ede\u3001\u7c97\u9ad4\u659c\u9ad4\u3001\u8d85\u9023\u7d50\u3001\u884c\u6578\u9ad8\u5ea6<\/h5>\n<hr \/>\n<h4>\u6587\u7ae0\u76ee\u9304<\/h4>\n<ol>\n<li><a href=\"#a\">\u6bb5\u843d\u6587\u5b57<\/a><\/li>\n<li><a href=\"#b\">\u5e95\u7dda\u653e\u5927<\/a><\/li>\n<li><a href=\"#c\">\u80cc\u666f\u984f\u8272\u6587\u5b57\u984f\u8272<\/a><\/li>\n<li><a href=\"#d\">\u9ede\u64ca\u5716\u6a19<\/a><\/li>\n<li><a href=\"#e\">\u6bb5\u843d\u5716\u522a\u9664\u7dda<\/a><\/li>\n<li><a href=\"#f\">\u6bb5\u843d\u5713\u9ede\u4fee\u98fe<\/a><\/li>\n<li><a href=\"#g\">\u7c97\u9ad4\u659c\u9ad4<\/a><\/li>\n<li><a href=\"#h\">\u8d85\u9023\u7d50\u884c\u6578\u9ad8\u5ea6<\/a><\/li>\n<li><a href=\"#i\">\u756b\u9762\u5e03\u5c40<\/a><\/li>\n<li><a href=\"#j\">\u7a0b\u5f0f\u7bc4\u4f8b<\/a><\/li>\n<li><a href=\"#k\">\u6548\u679c\u5c55\u793a<\/a><\/li>\n<li><a href=\"#l\">Github<\/a><\/li>\n<\/ol>\n<hr \/>\n<p><a id=\"a\"><\/a><\/p>\n<h4>1.\u6bb5\u843d\u6587\u5b57<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val leadingMarginText = findViewById&lt;TextView&gt;(R.id.leadingMarginText)\n\nval one = \"1.\u6b64APP\u6240\u767c\u9001\u4e4b\u9a57\u8b49\u78bc,\u5c07\u5728\u60a8\u7d22\u53d63\u5206\u9418\u5f8c\u5931\u6548\u3002\\n2.\u7121\u6cd5\u6536\u5230\u9a57\u8b49\u78bc\u55ce\uff1f\\n\"\nval spannableStringBuilder = SpannableStringBuilder(one)\n\/\/\u8a08\u7b97\u8981\u7a7a\u591a\u5c11\u683c\nval oneMeasure = leadingMarginText.paint.measureText(\"1.\").toInt()\n\/\/\u8a2d\u5b9a\u6bb5\u843d\u7684\u6587\u5b57\u9577\u5ea6\nspannableStringBuilder.setSpan(\n    LeadingMarginSpan.Standard(0, oneMeasure),\n    0,\n    spannableStringBuilder.length,\n    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE\n)\n\nval two = \"a.\u624b\u6a5f\u8a2d\u5b9a\u662f\u5426\u6709\u963b\u6514\u5ee3\u544a\u8a0a\u606f\\nb.\u8a0a\u606f\u5bb9\u91cf\u5df2\u6eff\u3001\u8a0a\u865f\u662f\u5426\u6b63\u5e38\\nc.\u82e5\u4ee5\u4e0a\u7686\u6b63\u5e38\u4ecd\u7121\u6cd5\u6536\u5230\u7c21\u8a0a\u8acb\u5148\u8207\u60a8\u7684\u96fb\u4fe1\u516c\u53f8\u78ba\u8a8d\uff0c\u4ee5\u514d\u91cd\u8907\u767c\u9001\u591a\u6b21\u7c21\u8a0a\u9a57 \u8b49\u78bc\u5c0e\u81f4\u5e33\u865f\u7121\u6cd5\u4f7f\u7528\u3002\"\nspannableStringBuilder.append(two)\n\/\/\u8a08\u7b97\u8981\u7a7a\u591a\u5c11\u683c\nval twoMeasure = leadingMarginText.paint.measureText(\"1.a.\").toInt()\n\/\/\u8a2d\u5b9a\u6bb5\u843d\u7684\u6587\u5b57\u9577\u5ea6\nspannableStringBuilder.setSpan(\n    LeadingMarginSpan.Standard(\n        oneMeasure,\n        twoMeasure\n    ), one.length, spannableStringBuilder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE\n)\n\nleadingMarginText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"b\"><\/a><\/p>\n<h4>2.\u5e95\u7dda\u653e\u5927<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val underlineSizeText = findViewById&lt;TextView&gt;(R.id.underlineSizeText)\nval spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u4e0b\u5e95\u7dda\u548c\u653e\u5927\u548c\u7e2e\u5c0f\u7bc4\u4f8b\")\n\/\/\u4e0b\u5e95\u7dda\nspannableStringBuilder.setSpan(UnderlineSpan(), 4,6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u653e\u5927\nspannableStringBuilder.setSpan(RelativeSizeSpan(1.5f), 7,9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u7e2e\u5c0f\nspannableStringBuilder.setSpan(RelativeSizeSpan(0.5f), 10,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\nunderlineSizeText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"c\"><\/a><\/p>\n<h4>3.\u80cc\u666f\u984f\u8272\u6587\u5b57\u984f\u8272<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val backgroundForegroundText = findViewById&lt;TextView&gt;(R.id.backgroundForegroundText)\nval spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u80cc\u666f\u984f\u8272\u548c\u6587\u5b57\u984f\u8272\u7bc4\u4f8b\")\n\/\/\u80cc\u666f\u984f\u8272\nspannableStringBuilder.setSpan(BackgroundColorSpan(Color.RED), 3,7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u6587\u5b57\u984f\u8272\nspannableStringBuilder.setSpan(ForegroundColorSpan(Color.BLUE), 8,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\nbackgroundForegroundText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"d\"><\/a><\/p>\n<h4>4.\u9ede\u64ca\u5716\u6a19<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val clickImageText = findViewById&lt;TextView&gt;(R.id.clickImageText)\nval spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u90e8\u5206\u9ede\u64ca\u548c\u5716\u6a19\u7bc4\u4f8b\")\n\/\/\u80cc\u666f\u984f\u8272\nspannableStringBuilder.setSpan(object : ClickableSpan() {\n    override fun onClick(view: View) {\n        Toast.makeText(this@MainActivity, \"\u9ede\u64ca\u4e86\", Toast.LENGTH_SHORT).show()\n    }\n}, 3,7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u6587\u5b57\u984f\u8272(\u6539\u85cd\u8272\u6bd4\u8f03\u50cf\u53ef\u9ede\u64ca\u7684\u6a23\u5b50)\nspannableStringBuilder.setSpan(ForegroundColorSpan(Color.BLUE), 3,7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u5716\u6a19\nval imageSpan = ImageSpan(this, R.drawable.apple)\nspannableStringBuilder.setSpan(imageSpan, 8,10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n\/\/\u8a2d\u5b9a\u624d\u80fd\u9ede\nclickImageText.movementMethod = LinkMovementMethod.getInstance()\nclickImageText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"e\"><\/a><\/p>\n<h4>5.\u6bb5\u843d\u5716\u522a\u9664\u7dda<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val drawableStrikeThroughText = findViewById&lt;TextView&gt;(R.id.drawableStrikeThroughText)\nval spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u9996\u5716\u548c\u522a\u9664\u7dda\u7bc4\u4f8b\")\n\/\/\u9996\u5716\nval apple = ContextCompat.getDrawable(this, R.drawable.apple)!!\nspannableStringBuilder.setSpan(DrawableMarginSpan(apple), 0,1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u522a\u9664\u7dda\nspannableStringBuilder.setSpan(StrikethroughSpan(), 6,9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\ndrawableStrikeThroughText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"f\"><\/a><\/p>\n<h4>6.\u6bb5\u843d\u5713\u9ede\u4fee\u98fe<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val bulletMaskFilterText = findViewById&lt;TextView&gt;(R.id.bulletMaskFilterText)\nval spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u6bb5\u843d\u5713\u9ede\u548c\u4fee\u98fe\u6a21\u7cca\u7bc4\u4f8b\")\n\/\/\u6bb5\u843d\u5713\u9ede\nval width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5f, resources.displayMetrics).toInt()\nval bulletSpan = BulletSpan(width, Color.RED)\nspannableStringBuilder.setSpan(bulletSpan, 0,1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u4fee\u98fe\u6a21\u7cca\nval blurMaskFilterSpan = MaskFilterSpan(BlurMaskFilter(resources.displayMetrics.density * 2, BlurMaskFilter.Blur.NORMAL))\nspannableStringBuilder.setSpan(blurMaskFilterSpan, 8,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\nbulletMaskFilterText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"g\"><\/a><\/p>\n<h4>7.\u7c97\u9ad4\u659c\u9ad4<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val boldItalicText = findViewById&lt;TextView&gt;(R.id.boldItalicText)\nval spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u7c97\u9ad4\u548c\u659c\u9ad4\u7bc4\u4f8b\")\n\/\/\u7c97\u9ad4\nspannableStringBuilder.setSpan(StyleSpan(Typeface.BOLD), 3,5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u659c\u9ad4\nspannableStringBuilder.setSpan(StyleSpan(Typeface.ITALIC), 6,8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\nboldItalicText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"h\"><\/a><\/p>\n<h4>8.\u8d85\u9023\u7d50\u884c\u6578\u9ad8\u5ea6<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">val urlLineHeightText = findViewById&lt;TextView&gt;(R.id.urlLineHeightText)\nval spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684Google\u8d85\u9023\u7d50\u548c\u884c\u6578\u9ad8\u5ea6\u884c\u6578\u9ad8\u5ea6\u884c\u6578\u9ad8\u5ea6\u7bc4\u4f8b\u3002\")\n\/\/\u8d85\u9023\u7d50\nspannableStringBuilder.setSpan(URLSpan(\"https:\/\/www.google.com.tw\/\"), 3,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u6587\u5b57\u984f\u8272(\u6539\u85cd\u8272\u6bd4\u8f03\u50cf\u53ef\u9ede\u64ca\u7684\u6a23\u5b50)\nspannableStringBuilder.setSpan(ForegroundColorSpan(Color.BLUE), 3,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\/\/\u884c\u6578\u9ad8\u5ea6\nspannableStringBuilder.setSpan(LineHeightSpan.Standard(90), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n\/\/\u8a2d\u5b9a\u624d\u80fd\u9ede\nurlLineHeightText.movementMethod = LinkMovementMethod.getInstance()\nurlLineHeightText.text = spannableStringBuilder\n<\/code><\/pre>\n<p><a id=\"i\"><\/a><\/p>\n<h4>9.\u756b\u9762\u5e03\u5c40<\/h4>\n<pre><code class=\"language-XML line-numbers\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".MainActivity\"&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/leadingMarginText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" \/&gt;\n\n    &lt;View\n        android:id=\"@+id\/view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color\/black\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/leadingMarginText\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/underlineSizeText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/view\" \/&gt;\n\n    &lt;View\n        android:id=\"@+id\/view2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color\/black\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/underlineSizeText\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/backgroundForegroundText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/view2\" \/&gt;\n\n    &lt;View\n        android:id=\"@+id\/view3\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color\/black\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/backgroundForegroundText\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/clickImageText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/view3\" \/&gt;\n\n    &lt;View\n        android:id=\"@+id\/view4\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color\/black\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/clickImageText\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/drawableStrikeThroughText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/view4\" \/&gt;\n\n    &lt;View\n        android:id=\"@+id\/view5\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color\/black\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/drawableStrikeThroughText\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/bulletMaskFilterText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/view5\" \/&gt;\n\n    &lt;View\n        android:id=\"@+id\/view6\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color\/black\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/bulletMaskFilterText\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/boldItalicText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/view6\" \/&gt;\n\n    &lt;View\n        android:id=\"@+id\/view7\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"8dp\"\n        android:background=\"@color\/black\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/boldItalicText\" \/&gt;\n\n    &lt;androidx.appcompat.widget.AppCompatTextView\n        android:id=\"@+id\/urlLineHeightText\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"32dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginEnd=\"32dp\"\n        android:textColor=\"@color\/black\"\n        android:textSize=\"16sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id\/view7\" \/&gt;\n\n&lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;\n<\/code><\/pre>\n<p><a id=\"j\"><\/a><\/p>\n<h4>10.\u7a0b\u5f0f\u7bc4\u4f8b<\/h4>\n<pre><code class=\"language-Kotlin line-numbers\">package com.example.test\n\nimport android.annotation.SuppressLint\nimport android.graphics.*\nimport android.os.Bundle\nimport android.text.*\nimport android.text.method.LinkMovementMethod\nimport android.text.style.*\nimport android.util.TypedValue\nimport android.view.View\nimport android.widget.TextView\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.ContextCompat\n\n\nclass MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        \/\/\u6bb5\u843d\u6587\u5b57\n        leadingMargin()\n\n        \/\/\u5e95\u7dda\u653e\u5927\n        underLineSize()\n\n        \/\/\u80cc\u666f\u6587\u5b57\u984f\u8272\n        backgroundForeground()\n\n        \/\/\u9ede\u64ca\u5716\u6a19\n        clickImageText()\n\n        \/\/\u6bb5\u843d\u5716\u522a\u9664\u7dda\n        drawableStrikeThrough()\n\n        \/\/\u6bb5\u843d\u5713\u9ede\u4fee\u98fe\n        bulletMaskFilter()\n\n        \/\/\u7c97\u9ad4\u659c\u9ad4\n        boldItalic()\n\n        \/\/\u8d85\u9023\u7d50\u884c\u6578\u9ad8\u5ea6\n        urlLineHeight()\n    }\n\n    @SuppressLint(\"NewApi\")\n    private fun urlLineHeight() {\n        val urlLineHeightText = findViewById&lt;TextView&gt;(R.id.urlLineHeightText)\n        val spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684Google\u8d85\u9023\u7d50\u548c\u884c\u6578\u9ad8\u5ea6\u884c\u6578\u9ad8\u5ea6\u884c\u6578\u9ad8\u5ea6\u7bc4\u4f8b\u3002\")\n        \/\/\u8d85\u9023\u7d50\n        spannableStringBuilder.setSpan(URLSpan(\"https:\/\/www.google.com.tw\/\"), 3,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u6587\u5b57\u984f\u8272(\u6539\u85cd\u8272\u6bd4\u8f03\u50cf\u53ef\u9ede\u64ca\u7684\u6a23\u5b50)\n        spannableStringBuilder.setSpan(ForegroundColorSpan(Color.BLUE), 3,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u884c\u6578\u9ad8\u5ea6\n        spannableStringBuilder.setSpan(LineHeightSpan.Standard(90), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n        \/\/\u8a2d\u5b9a\u624d\u80fd\u9ede\n        urlLineHeightText.movementMethod = LinkMovementMethod.getInstance()\n        urlLineHeightText.text = spannableStringBuilder\n    }\n\n    private fun boldItalic() {\n        val boldItalicText = findViewById&lt;TextView&gt;(R.id.boldItalicText)\n        val spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u7c97\u9ad4\u548c\u659c\u9ad4\u7bc4\u4f8b\")\n        \/\/\u7c97\u9ad4\n        spannableStringBuilder.setSpan(StyleSpan(Typeface.BOLD), 3,5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u659c\u9ad4\n        spannableStringBuilder.setSpan(StyleSpan(Typeface.ITALIC), 6,8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        boldItalicText.text = spannableStringBuilder\n    }\n\n    private fun bulletMaskFilter() {\n        val bulletMaskFilterText = findViewById&lt;TextView&gt;(R.id.bulletMaskFilterText)\n        val spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u6bb5\u843d\u5713\u9ede\u548c\u4fee\u98fe\u6a21\u7cca\u7bc4\u4f8b\")\n        \/\/\u6bb5\u843d\u5713\u9ede\n        val width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5f, resources.displayMetrics).toInt()\n        val bulletSpan = BulletSpan(width, Color.RED)\n        spannableStringBuilder.setSpan(bulletSpan, 0,1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u4fee\u98fe\u6a21\u7cca\n        val blurMaskFilterSpan = MaskFilterSpan(BlurMaskFilter(resources.displayMetrics.density * 2, BlurMaskFilter.Blur.NORMAL))\n        spannableStringBuilder.setSpan(blurMaskFilterSpan, 8,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n        bulletMaskFilterText.text = spannableStringBuilder\n    }\n\n    private fun drawableStrikeThrough() {\n        val drawableStrikeThroughText = findViewById&lt;TextView&gt;(R.id.drawableStrikeThroughText)\n        val spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u9996\u5716\u548c\u522a\u9664\u7dda\u7bc4\u4f8b\")\n        \/\/\u9996\u5716\n        val apple = ContextCompat.getDrawable(this, R.drawable.apple)!!\n        spannableStringBuilder.setSpan(DrawableMarginSpan(apple), 0,1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u522a\u9664\u7dda\n        spannableStringBuilder.setSpan(StrikethroughSpan(), 6,9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n        drawableStrikeThroughText.text = spannableStringBuilder\n    }\n\n    private fun clickImageText() {\n        val clickImageText = findViewById&lt;TextView&gt;(R.id.clickImageText)\n        val spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u90e8\u5206\u9ede\u64ca\u548c\u5716\u6a19\u7bc4\u4f8b\")\n        \/\/\u80cc\u666f\u984f\u8272\n        spannableStringBuilder.setSpan(object : ClickableSpan() {\n            override fun onClick(view: View) {\n                Toast.makeText(this@MainActivity, \"\u9ede\u64ca\u4e86\", Toast.LENGTH_SHORT).show()\n            }\n        }, 3,7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u6587\u5b57\u984f\u8272(\u6539\u85cd\u8272\u6bd4\u8f03\u50cf\u53ef\u9ede\u64ca\u7684\u6a23\u5b50)\n        spannableStringBuilder.setSpan(ForegroundColorSpan(Color.BLUE), 3,7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u5716\u6a19\n        val imageSpan = ImageSpan(this, R.drawable.apple)\n        spannableStringBuilder.setSpan(imageSpan, 8,10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n        \/\/\u8a2d\u5b9a\u624d\u80fd\u9ede\n        clickImageText.movementMethod = LinkMovementMethod.getInstance()\n        clickImageText.text = spannableStringBuilder\n    }\n\n    private fun backgroundForeground() {\n        val backgroundForegroundText = findViewById&lt;TextView&gt;(R.id.backgroundForegroundText)\n        val spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u80cc\u666f\u984f\u8272\u548c\u6587\u5b57\u984f\u8272\u7bc4\u4f8b\")\n        \/\/\u80cc\u666f\u984f\u8272\n        spannableStringBuilder.setSpan(BackgroundColorSpan(Color.RED), 3,7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u6587\u5b57\u984f\u8272\n        spannableStringBuilder.setSpan(ForegroundColorSpan(Color.BLUE), 8,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n        backgroundForegroundText.text = spannableStringBuilder\n    }\n\n    private fun underLineSize() {\n        val underlineSizeText = findViewById&lt;TextView&gt;(R.id.underlineSizeText)\n        val spannableStringBuilder = SpannableStringBuilder(\"\u6587\u5b57\u7684\u4e0b\u5e95\u7dda\u548c\u653e\u5927\u548c\u7e2e\u5c0f\u7bc4\u4f8b\")\n        \/\/\u4e0b\u5e95\u7dda\n        spannableStringBuilder.setSpan(UnderlineSpan(), 4,6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u653e\u5927\n        spannableStringBuilder.setSpan(RelativeSizeSpan(1.5f), 7,9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n        \/\/\u7e2e\u5c0f\n        spannableStringBuilder.setSpan(RelativeSizeSpan(0.5f), 10,12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n        underlineSizeText.text = spannableStringBuilder\n    }\n\n    private fun leadingMargin() {\n        val leadingMarginText = findViewById&lt;TextView&gt;(R.id.leadingMarginText)\n\n        val one = \"1.\u6b64APP\u6240\u767c\u9001\u4e4b\u9a57\u8b49\u78bc,\u5c07\u5728\u60a8\u7d22\u53d63\u5206\u9418\u5f8c\u5931\u6548\u3002\\n2.\u7121\u6cd5\u6536\u5230\u9a57\u8b49\u78bc\u55ce\uff1f\\n\"\n        val spannableStringBuilder = SpannableStringBuilder(one)\n        \/\/\u8a08\u7b97\u8981\u7a7a\u591a\u5c11\u683c\n        val oneMeasure = leadingMarginText.paint.measureText(\"1.\").toInt()\n        \/\/\u8a2d\u5b9a\u6bb5\u843d\u7684\u6587\u5b57\u9577\u5ea6\n        spannableStringBuilder.setSpan(\n            LeadingMarginSpan.Standard(0, oneMeasure),\n            0,\n            spannableStringBuilder.length,\n            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE\n        )\n\n        val two = \"a.\u624b\u6a5f\u8a2d\u5b9a\u662f\u5426\u6709\u963b\u6514\u5ee3\u544a\u8a0a\u606f\\nb.\u8a0a\u606f\u5bb9\u91cf\u5df2\u6eff\u3001\u8a0a\u865f\u662f\u5426\u6b63\u5e38\\nc.\u82e5\u4ee5\u4e0a\u7686\u6b63\u5e38\u4ecd\u7121\u6cd5\u6536\u5230\u7c21\u8a0a\u8acb\u5148\u8207\u60a8\u7684\u96fb\u4fe1\u516c\u53f8\u78ba\u8a8d\uff0c\u4ee5\u514d\u91cd\u8907\u767c\u9001\u591a\u6b21\u7c21\u8a0a\u9a57 \u8b49\u78bc\u5c0e\u81f4\u5e33\u865f\u7121\u6cd5\u4f7f\u7528\u3002\"\n        spannableStringBuilder.append(two)\n        \/\/\u8a08\u7b97\u8981\u7a7a\u591a\u5c11\u683c\n        val twoMeasure = leadingMarginText.paint.measureText(\"1.a.\").toInt()\n        \/\/\u8a2d\u5b9a\u6bb5\u843d\u7684\u6587\u5b57\u9577\u5ea6\n        spannableStringBuilder.setSpan(\n            LeadingMarginSpan.Standard(\n                oneMeasure,\n                twoMeasure\n            ), one.length, spannableStringBuilder.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE\n        )\n\n        leadingMarginText.text = spannableStringBuilder\n    }\n}\n<\/code><\/pre>\n<p><a id=\"k\"><\/a><\/p>\n<h4>11.\u6548\u679c\u5c55\u793a<\/h4>\n<p><a href=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2021\/09\/242552281_608315493518720_6274551621216007257_n.jpg\"><img decoding=\"async\" src=\"https:\/\/badgameshow.com\/fly\/wp-content\/uploads\/2021\/09\/242552281_608315493518720_6274551621216007257_n.jpg\" width=\"50%\"\/><\/a><\/p>\n<p><a id=\"l\"><\/a><\/p>\n<h4>12.Github<\/h4>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/github.com\/MuHongWeiWei\/SpannableStringBuilderDemo\" target=\"_blank\" rel=\"noopener\">Android SpannableStringBuilder \u7528\u6cd5 Github<\/a><\/p>\n\n<div style=\"font-size: 0px; height: 0px; line-height: 0px; margin: 0; padding: 0; clear: both;\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Android SpannableStringBuilder \u7528\u6cd5 SpannableStringBuilde &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"pgc_sgb_lightbox_settings":"","footnotes":""},"categories":[5],"tags":[13,15,202],"class_list":["post-1510","post","type-post","status-publish","format-standard","hentry","category-android","tag-android","tag-kotlin","tag-spannablestringbuilder"],"_links":{"self":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/comments?post=1510"}],"version-history":[{"count":1,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1510\/revisions"}],"predecessor-version":[{"id":1512,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/posts\/1510\/revisions\/1512"}],"wp:attachment":[{"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/media?parent=1510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/categories?post=1510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/badgameshow.com\/fly\/wp-json\/wp\/v2\/tags?post=1510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}