La primera herramienta de compilación Spannable compatible con regex/match

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)

Supongo que te gusta

Origin juejin.im/post/7083702519951523848
Recomendado
Clasificación