android 各種Span使用得當可以用Edittext做一個文本編輯器

本文轉載自:http://www.2cto.com/kf/201512/455755.html

49.Android 各種Span

Android 各種Span 前言 SpannableStringBuilder URLSpan UnderlineSpan TypefaceSpan TextAppearanceSpan TabStopSpanStandard SuperscriptSpan SubscriptSpan StrikethroughSpan ScaleXSpan StyleSpan RelativeSizeSpan QuoteSpan MaskFilterSpan LeadingMarginSpanStandard ImageSpan IconMarginSpan ForegroundColorSpan DrawableMarginSpan BulletSpan BackgroundColorSpan AlignmentSpanStandard AbsoluteSizeSpan ClickableSpan 源代碼


前言

android.text.style包下,有一些Span類,可以提供我們完成一些在TextView中的特殊內容。(比如:部分內容顏色、字體、大小不同等等,更有部分字體可點擊。

還有一個SpannableStringBuilder,可以幫助我們設置Span。

底下也有全部的源代碼


SpannableStringBuilder

SpannableStringBuilder可以方便我們更好的設置上對應的Span。

設置Span
SpannableStringBuilder.setSpan(Object what, int start, int end, int flags)

這裏的Flag表示:start和end是開區間還是閉區間。

Flag:

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE —— (a,b)

Spanned.SPAN_EXCLUSIVE_INCLUSIVE —— (a,b]

Spanned.SPAN_INCLUSIVE_EXCLUSIVE —— [a,b)

Spanned.SPAN_INCLUSIVE_INCLUSIVE —— [a,b]


URLSpan

功能:點擊文字,可以打開一個URL。

URLSpan(String url)

?
1
2
3
4
5
6
7
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new URLSpan("https://github.com/CaMnter"), start, sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);
// 在單擊鏈接時凡是有要執行的動作,都必須設置MovementMethod對象
contentTV.setMovementMethod(LinkMovementMethod.getInstance());
// 設置點擊後的顏色,這裏涉及到ClickableSpan的點擊背景
contentTV.setHighlightColor(0xff8FABCC);</code>

UnderlineSpan

功能:設置文字下劃線。

UnderlineSpan()

?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new UnderlineSpan(), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

UnderlineSpan

功能:設置文字下劃線。

UnderlineSpan()

?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new UnderlineSpan(), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

TypefaceSpan

功能:設置文字字體。

TypefaceSpan(String family)構造方法源碼中的註釋提示了三種系統字體:

monospace

serif

sans-serif

?
1
2
3
4
5
6
7
<code class="language-java hljs ">    /**
     * @param family The font family for this typeface.  Examples include
     * "monospace", "serif", and "sans-serif".
     */
    public TypefaceSpan(String family) {
        mFamily = family;
    }</code>
?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new TypefaceSpan("serif"), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

TextAppearanceSpan

功能:設置文字字體、文字樣式(粗體、斜體、等等)、文字顏色狀態、文字下劃線顏色狀態等等。

TextAppearanceSpan的三個構造方法

TextAppearanceSpan(Context context, int appearance)

TextAppearanceSpan(Context context, int appearance, int colorList)

TextAppearanceSpan(String family, int style, int size,ColorStateList color, ColorStateList linkColor)

family:

monospace

serif

sans-serif

style:

Typeface.NORMAL

Typeface.BOLD

Typeface.ITALIC

Typeface.BOLD_ITALIC

size:表示字體大小(單位px)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ColorStateList colorStateList = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    colorStateList = this.activity.getColorStateList(R.color.selector_apperarance_span);
} else {
    try {
        colorStateList = ColorStateList.createFromXml(this.activity.getResources(), this.activity.getResources().getXml(R.color.selector_apperarance_span));
    } catch (XmlPullParserException | IOException e) {
        e.printStackTrace();
    }
}
ssb.setSpan(new TextAppearanceSpan("serif", Typeface.BOLD_ITALIC, this.activity.getResources().getDimensionPixelSize(R.dimen.text_appearance_span), colorStateList, colorStateList), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

TabStopSpan.Standard

功能:每行的MarginLeft的偏移量(跟 \t 和 \n 有關係)。

TabStopSpan.Standard(int where)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
String[] subs = content.split(" ");
ssb = new SpannableStringBuilder();
/**
 * TabStopSpan. Standard related to \t and \n
 * TabStopSpan.Standard 跟 \t 和 \n 有關係
 */
for (String sub1 : subs) {
    ssb.append("\t").append(sub1).append(" ");
    ssb.append("\n");
}
ssb.setSpan(new TabStopSpan.Standard(126), 0, ssb.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

加載中...vcFNwYW4uU3RhbmRhcmQ=" src="http://www.2cto.com/uploadfile/Collfiles/20151230/20151230092053158.png" title="\" />


SuperscriptSpan

功能:文字設置爲上標,數學公式中用到。

SuperscriptSpan(Parcel src)

?
1
2
3
4
5
6
7
8
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.replace(start, start + sub.length(), "Save6");
Parcel parcel = Parcel.obtain();
parcel.writeInt(6);
int sixPosition = ssb.toString().indexOf("6");
ssb.setSpan(new SuperscriptSpan(parcel), sixPosition, sixPosition + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
parcel.recycle();
contentTV.setText(ssb);</code>

SubscriptSpan

功能:文字設置爲下標,化學式中用到。

SubscriptSpan(Parcel src)

?
1
2
3
4
5
6
7
8
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.replace(start, start + sub.length(), "Save6");
Parcel parcel = Parcel.obtain();
parcel.writeInt(6);
int sixPosition = ssb.toString().indexOf("6");
ssb.setSpan(new SubscriptSpan(parcel), sixPosition, sixPosition + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
parcel.recycle();
contentTV.setText(ssb);</code>

StrikethroughSpan

功能:文字設置刪除線。

StrikethroughSpan()

?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new StrikethroughSpan(), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

ScaleXSpan

功能:文字橫向縮放。

ScaleXSpan(float proportion)

proportion:縮放比例

?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new ScaleXSpan(2.0f), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

StyleSpan

功能:文字設置樣式(正常、粗體、斜體、粗斜體)。

StyleSpan(int style)

style:

Typeface.NORMAL

Typeface.BOLD

Typeface.ITALIC

Typeface.BOLD_ITALIC

?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

RelativeSizeSpan

功能:設置文字相對大小,指相對於文本設定的大小的相對比例。

RelativeSizeSpan(float proportion)

proportion:大小比例。

?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new RelativeSizeSpan(6.0f), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

QuoteSpan

功能:設置文字左側顯示引用樣式(一條豎線)。

QuoteSpan(@ColorInt int color)

color:豎線的顏色。

?
1
2
3
<code class="language-java hljs ">SpannableStringBuilder ssb = new SpannableStringBuilder(content);
ssb.setSpan(new QuoteSpan(0xff000000), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
contentTV.setText(ssb);</code>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章