El mismo tipo de marco en el mercado solo usa la programación en cadena para simplificar las llamadas a métodos y limitar los métodos oficiales.
Pero el texto enriquecido es básicamente un marcador de posición o cadena concatenada, por lo que la expectativa es concatenar Span y reemplazo regular como una cadena.
Aquí está la biblioteca de extensión recomendada para Spannable: spannable
Realizar vista previa del efecto
La interfaz CharSequence, que es utilizada por todas las funciones por motivos generales, no es diferente de una cadena cuando se usa.
Se puede configurar/insertar/agregar para construir Span
// 通过拼接方式展示价格
tv5.text = "¥".setSpan(ColorSpan("#ed6a2c"))
.addSpan("39.9", arrayOf(ColorSpan("#ed6a2c"), AbsoluteSizeSpan(18, true)))
.addSpan(" 1000+ 人付款")
.addSpan("image", CenterImageSpan(this, R.drawable.ic_touch).setDrawableSize(20, dp = true))
复制代码
Los estilos se pueden crear usando sustitución literal/regex como cadenas
tv.movementMethod = ClickableMovementMethod.getInstance()
tv.text = "隐私权政策 | 许可 | 品牌指南".replaceSpan("隐私权政策") {
URLSpan("https://github.com/") // 仅替换效果
}
tv.text = "隐私权政策 | 许可 | 品牌指南".replaceSpan("隐私权政策") {
listOf(URLSpan("https://github.com/"), ColorSpan("#ed6a2c")) // 替换多个效果
}
tv.text = "隐私权政策 | 许可 | 品牌指南".replaceSpan("隐私权政策") {
SpannableString("友情链接").setSpan(URLSpan("https://github.com/")) // 替换文字以及Span效果
}
// 还可以使用正则替换
tv2.text = "我们可以艾特用户@用户昵称 或者创建#热门标签"
.replaceSpan("@[^@]+?(?=\\s|\$)".toRegex()) { matchResult ->
HighlightSpan("#ed6a2c") {
Toast.makeText(this@MainActivity, "点击用户 ${matchResult.value}", Toast.LENGTH_SHORT).show()
}
}
// 通过丰富的正则/匹配功能你可以快速渲染占位符富文本
tv2.text = "当前货币单位为{{美元}}".replaceSpan("{{美元}}"){
CenterImageSpan(context, R.drawable.ic_dollar) // 将占位图替换成图片
}
复制代码
Dado que todos los valores de retorno de función y los receptores son CharSequence, incluso puede encapsular un conjunto de reglas de intervalo en una función, como implementar un mensaje de transmisión en vivo/contenido de comentario/cuadro de entrada de texto enriquecido simple
función
La función utilizada debe ser muy simple.
función | introducir |
---|---|
establecerSpan | Configurar tramos |
añadirSpan | Agregar/Insertar tramo o cadena |
reemplazarSpan | Reemplazo/reemplazo regular Tramo o cadena |
replaceSpanFirst/replaceSpanLast | Reemplazar/reemplazar regularmente la primera/última ocurrencia de Span o String |
La mayor parte del mercado usa programación en cadena para empalmar Span. Creo que la escalabilidad es extremadamente pobre, y para ahorrar algunas palabras, se construyen un montón de funciones para aumentar el costo de aprendizaje. Si te gusta DSL o la programación en cadena, puedes use la versión bifurcada de otros autores: SpannableX
E incluye algunas implementaciones de efectos Span de uso común, bienvenido a contribuir con las suyas
Lapso | describir |
---|---|
CenterImageSpan | Alineación vertical/ancho de imagen/alto/relación de imagen fija |
GlideImageSpan | Cargar imagen de red/alineación vertical/ancho/alto de imagen/proporción de imagen fija |
ColorSpan | Crear rápidamente colores de texto |
ResalteSpan | Crear color de fuente/estilo de fuente/efecto en el que se puede hacer clic |
ClickableMovementMethodClickableMovementMethod | Equivalente a LinkMovementMethod, pero sin el color de fondo del clic |
El funcionario solo proporciona ImageSpan, y la alineación vertical también requiere api23 o superior, y no se puede especificar el ancho, por lo que se proporcionan dos nuevos ImageSpans
CenterImageSpan admite la especificación de ancho y alto de imagen, y la escala no hará que la imagen se estire. Alineación central vertical, altura adaptable
GlideImageSpan admite la descarga de imágenes y el uso de Glide para obtener más opciones de carga de imágenes personalizadas (como recortar/redondear/marcador de posición)