Android Kotlin:如何使用Markwon设置标题换行及文本行间距
如何在Markwon中设置文本行间距?
我已查阅Markwon的API及插件,但未找到添加文本行间距的方法。曾尝试为TextView设置setLineSpacing(),也尝试在各span样式中设置,但均无效。期望在Markwon库中找到可调整Markdown渲染时文本行间距的方法或插件,效果类似标准TextView的lineSpacing设置。
我的示例代码如下:
fun textToMarkdown(context: Context, text: String, textView: AppCompatTextView) { val markwon = Markwon.builder(context) .usePlugin(SoftBreakAddsNewLinePlugin.create()) .usePlugin(object : AbstractMarkwonPlugin() { override fun configureSpansFactory(builder: MarkwonSpansFactory.Builder) { builder.setFactory(Heading::class.java) { _, props -> val level = props.get(CoreProps.HEADING_LEVEL) ?: 0 val textAppearanceSpans = when (level) { 1 -> arrayOf(TextAppearanceSpan(context, R.style.H1Style)) 2 -> arrayOf(TextAppearanceSpan(context, R.style.H2Style)) 3 -> arrayOf(TextAppearanceSpan(context, R.style.H3Style)) 4 -> arrayOf(TextAppearanceSpan(context, R.style.H4Style)) 5 -> arrayOf(TextAppearanceSpan(context, R.style.H5Style)) 6 -> arrayOf(TextAppearanceSpan(context, R.style.H6Style)) else -> arrayOf() } textAppearanceSpans } } }) .build() if(text.isNotBlank()){ val markdown = markwon.toMarkdown(text) markwon.setParsedMarkdown(textView, markdown) textView.visibility = View.VISIBLE }else{ textView.visibility = View.GONE } }
解决方案
Markwon没有直接提供行间距配置选项,但可以通过自定义LineHeightSpan实现需求,以下是两种可靠方案:
方案1:自定义插件全局控制行间距
通过为Paragraph(普通段落)和Heading(标题)节点添加LineHeightSpan.Standard,分别控制不同文本类型的行间距:
fun textToMarkdown(context: Context, text: String, textView: AppCompatTextView) { // 转换dp为px,定义普通文本行高 val normalLineHeight = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 24f, context.resources.displayMetrics ).toInt() // 定义各标题级别对应的行高 val headingLineHeightMap = mapOf( 1 to TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 36f, context.resources.displayMetrics).toInt(), 2 to TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 32f, context.resources.displayMetrics).toInt(), 3 to TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 28f, context.resources.displayMetrics).toInt() // 4-6级标题可按需补充 ) val markwon = Markwon.builder(context) .usePlugin(SoftBreakAddsNewLinePlugin.create()) .usePlugin(object : AbstractMarkwonPlugin() { override fun configureSpansFactory(builder: MarkwonSpansFactory.Builder) { // 为普通段落添加行间距span builder.appendFactory(Paragraph::class.java) { _, _ -> arrayOf(LineHeightSpan.Standard(normalLineHeight)) } // 为标题添加行间距span,结合原有样式 builder.setFactory(Heading::class.java) { _, props -> val level = props.get(CoreProps.HEADING_LEVEL) ?: 0 val textAppearanceSpans = when (level) { 1 -> arrayOf(TextAppearanceSpan(context, R.style.H1Style)) 2 -> arrayOf(TextAppearanceSpan(context, R.style.H2Style)) 3 -> arrayOf(TextAppearanceSpan(context, R.style.H3Style)) 4 -> arrayOf(TextAppearanceSpan(context, R.style.H4Style)) 5 -> arrayOf(TextAppearanceSpan(context, R.style.H5Style)) 6 -> arrayOf(TextAppearanceSpan(context, R.style.H6Style)) else -> arrayOf() } // 获取当前标题对应的行高span,没有则用空数组 val lineHeightSpan = headingLineHeightMap[level]?.let { arrayOf(LineHeightSpan.Standard(it)) } ?: emptyArray() // 合并原有样式和行间距span textAppearanceSpans + lineHeightSpan } } }) .build() if(text.isNotBlank()){ val markdown = markwon.toMarkdown(text) markwon.setParsedMarkdown(textView, markdown) textView.visibility = View.VISIBLE }else{ textView.visibility = View.GONE } }
方案2:通过TextView XML样式设置
如果需要全局生效,可直接在TextView的XML布局中设置行间距属性,确保Markwon渲染时不会覆盖这些设置:
<androidx.appcompat.widget.AppCompatTextView android:id="@+id/markdown_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:lineSpacingExtra="4dp" android:lineSpacingMultiplier="1.2" />
注:若之前调用
setLineSpacing()无效,大概率是Markwon渲染时重置了文本样式,此时优先选择方案1更可靠。
内容的提问来源于stack exchange,提问作者Daniele Bellini
相关产品推荐
相关产品推荐

