Skip to content

Instantly share code, notes, and snippets.

@cuber5566
Last active September 27, 2019 03:31
Show Gist options
  • Save cuber5566/b800eb50a31761b7b106c864105ba141 to your computer and use it in GitHub Desktop.
Save cuber5566/b800eb50a31761b7b106c864105ba141 to your computer and use it in GitHub Desktop.
fun SpannableStringBuilder.appendText(string: String, self: SpannableStringBuilder.() -> SpannableStringBuilder): SpannableStringBuilder {
val newSpan = SpannableStringBuilder(string)
self(newSpan)
return append(newSpan)
}
fun SpannableStringBuilder.color(color: Int): SpannableStringBuilder {
val span = ForegroundColorSpan(color)
setSpan(span, 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return this
}
fun SpannableStringBuilder.size(textSize: Int): SpannableStringBuilder {
val span = AbsoluteSizeSpan(textSize)
setSpan(span, 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return this
}
fun SpannableStringBuilder.style(typeface: Int): SpannableStringBuilder {
val span = StyleSpan(typeface)
setSpan(span, 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return this
}
fun SpannableStringBuilder.underLine(): SpannableStringBuilder {
val span = UnderlineSpan()
setSpan(span, 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return this
}
fun SpannableStringBuilder.backgroundColor(color: Int): SpannableStringBuilder {
val span = BackgroundColorSpan(color)
setSpan(span, 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return this
}
fun SpannableStringBuilder.onClick(onClick:(View)->Unit): SpannableStringBuilder {
val span = object :ClickableSpan(){
override fun onClick(view: View) {
onClick.invoke(view)
}
}
setSpan(span, 0, length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return this
}
fun SpannableStringBuilder.appendDrawable(drawable: Drawable, self: SpannableImageBuilder.() -> SpannableImageBuilder): SpannableStringBuilder {
val newSpan = SpannableImageBuilder(drawable)
newSpan.append("d")
self(newSpan)
val imageSpan = ImageSpan(newSpan.drawable, ImageSpan.ALIGN_BOTTOM)
newSpan.setSpan(imageSpan, 0, newSpan.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return append(newSpan)
}
fun SpannableImageBuilder.color(color: Int): SpannableImageBuilder {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
drawable.colorFilter = BlendModeColorFilter(color, BlendMode.SRC_IN)
} else {
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN)
}
return this
}
fun SpannableImageBuilder.size(size: Int): SpannableImageBuilder {
drawable.setBounds(0, 0, size, size)
return this
}
fun SpannableImageBuilder.sizeFit(textView: TextView): SpannableImageBuilder {
val size = textView.lineHeight
drawable.setBounds(0, 0, size, size)
return this
}
data class SpannableImageBuilder(
var drawable: Drawable
) : SpannableStringBuilder()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment