Android リッチテキストの概要

1. アプリケーションシナリオの紹介

Android アプリケーション開発では、特にクールなインターフェイスを描画する UI が多数あります。テキスト行には、他の色や太字になる特別な単語があります。強調するために、これを行うためにいくつかの愚かな方法を使用できます。リンクしますが、デバイスの適応が問題です。色付きのテキストがたまたま改行にあった場合はどうすればよいですか。テキストの一部にいくつかのアイコンが散在している場合もありますが、どうすればよいでしょうか? そこで、今日の主人公リッチ テキスト エディターがこの問題をうまく解決します。

2. リッチテキスト SpannableString でできること

テキスト内の特定の場所にさまざまなスタイルとイベントを追加します。スタイルには、色、サイズ、背景、取り消し線、上付き文字と下付き文字、太字の斜体、および図が含まれます。イベントには、クリック イベント、ハイパーリンクなどが含まれます。コアコードは

val sb = SpannableString(content) //content表示文本内容
sb.setSpan(
	ForegroundColorSpan(specailColor), //span类型
 	startIndex, //span的起始index
 	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
 	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

特別: setSpan メソッドの最後のパラメーター フラグには、次の 4 つの値があります。 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE: 前後どちらでもありません。つまり、指定された範囲の前後に新しい文字を挿入しても、新しいスタイル (開始、終了) Spannable は
適用されません。
SPAN_EXCLUSIVE_INCLUSIVE: 前者を除外し、後者を含めます。つまり、新しいスタイルは、範囲文字 (開始、終了) の後に新しい文字が挿入された場合にのみ適用されます。
Spannable.SPAN_INCLUSIVE_EXCLUSIVE: 前に含まれますが、後には含まれません。 [開始、終了)
Spannable.SPAN_INCLUSIVE_INCLUSIVE: 前後の両方に含まれます。[始まりと終わり]

3. 簡易スパン適用例

3.1. 文字の色

val content = "这是一段文字,需要特殊颜色的内容"
val replaceTxt = "特殊颜色"
val sb = SpannableString(content) //content表示文本内容
val startIndex = content.indexOf(replaceTxt)
val endIndex = startIndex + replaceTxt.length
val specailColor = Color.parseColor("#0644a3")
sb.setSpan(
   ForegroundColorSpan(specailColor), //span类型 specailColor颜色
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

3.2. 特別なテキストをクリックします

val content = "这是一段文字,需要点击效果的内容"
val replaceTxt = "点击效果"
val sb = SpannableString(content) //content表示文本内容
val startIndex = content.indexOf(replaceTxt)
val endIndex = startIndex + replaceTxt.length
val sb = SpannableString(content) //content表示文本内容
val clickSpan: ClickableSpan = object : ClickableSpan() {
    
    
           override fun onClick(widget: View) {
    
    
          			Toast.makeText(context, "点击$replaceTxt", Toast.LENGTH_SHORT).show()
           }
           
           override fun updateDrawState(ds: TextPaint) {
    
    
               ds.run {
    
     //这里可以动态设置点击区域字符的字体样式,比如颜色、字体、大小、下划线、删除线等
                   typeface = FontManager.getNumberFont()
                   color = ContextCompat.getColor(context, R.color.c_fe0000)
               }
           }
       }
sb.setSpan(
   clickSpan, //span类型
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.movementMethod = LinkMovementMethod.getInstance()  //点击需要设置,不然没有点击事件
// textview点击时会有一个高亮色,如果不需要可以设置highlightColor为透明色
textview.text = sb

3.3. テキストのフォントサイズ

val sb = SpannableString(content) //content表示文本内容
sb.setSpan(
   AbsoluteSizeSpan(26,true), //第二个参数表示单位是否是dp
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

3.4. テキストにアイコンを挿入する

val sb = SpannableString(content) //content表示文本内容
val d = getResources().getDrawable(R.mipmap.ic_launcher)
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight())
val span = ImageSpan(d, ImageSpan.ALIGN_BASELINE) //图标基于文本基线对齐 对齐方式默认底部对齐
sb.setSpan(
   span, //span类型
	startIndex, //span的起始index
	endIndx, //span的结束index(一般为startIndex + replaceTxt.length)
	Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
)
textview.text = sb

4. SpannableStringBuilder と SpannableString

SpannableString で設定できるスパンは 1 つだけであり、コンテンツ内の異なる位置に複数の特殊効果がある場合は実装できません。もちろん、同じ位置に複数の特殊効果がある場合は、Span の updateDrawState(ds: TextPaint) メソッドをオーバーライドできます。
SpannableStringBuilder は複数のスパンを設定でき、各スパンを異なる位置に設定することも、同じ位置に設定することもできます。
それの使い方

val spb = SpannableStringBuilder(content)
spb.setSpan(span1, start, end, flag)
spb.setSpan(span2, start, end, flag)
textview.text = spb

特別: SpannableStringBuilder のコンテンツは、append(text: String) を通じて追加できます。新しいコンテンツを追加した後は、コンテンツの添字の変更に注意する必要があります。

おすすめ

転載: blog.csdn.net/qq_39734865/article/details/95461325