AndroidSpannableStringの詳細な分析

SpannableStringとは何ですか?

SpannableStringはCharSequenceの一種です。元のCharSequenceは、スタイルのないSpannableString文字のシーケンスです。文字シーケンスに基づいて指定された文字をレタッチできます。開発中、TextViewをパラメータとしてsetText(CharSequence)渡して、SpannableString表示を実現できます。効果さまざまなスタイルのテキストの。

作成方法

SpannableString spannableString = new SpannableString("如果我是陈奕迅");

SpannableStringレタッチする方法は

一般的に次のように設定します

spannableString.setSpan(Object what, int start, int end, int flags);

ここでいくつかのパラメータの意味を説明します

  • 何:あらゆる種類の研磨SpannableString Span;
  • int:洗練されるテキストフィールドの先頭にある添え字。
  • end:洗練されるテキストフィールドの終わりにある添え字。
  • flags:開始添え字と終了添え字を含めるかどうかを決定するフラグビット。4つのオプションのパラメーターがあります。
    • SPAN_INCLUSIVE_EXCLUSIVE:開始添え字を含めますが、終了添え字は含めません
    • SPAN_EXCLUSIVE_INCLUSIVE:開始添え字を含めず、終了添え字を含めます
    • SPAN_INCLUSIVE_INCLUSIVE:開始添え字と終了添え字の両方を含める
    • SPAN_EXCLUSIVE_EXCLUSIVE:開始添え字も終了添え字も含まれません

ここでは重要な役割が関係しています。これは、テキストのレタッチ方法を決定するさまざまなスパンであり、最後の3つのパラメーターは、レタッチするテキストを決定します。便宜上、次のフラグはデフォルトでSPAN_INCLUSIVE_EXCLUSIVEモードを使用します。

さまざまなスパン

まず、クラス構造図を見て、さまざまなスパン間の関係を理解し​​ます
ここに画像の説明を挿入

すべてのスパンが抽象クラスCharacterStyleを継承していることがわかります。さらに、MetricAffectingSpan、ReplacementSpan、ClickableSpanはすべて抽象クラスです。以下に、一般的に使用されるいくつかのスパンを示します。

ForegroundColorSpan 前景色

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.GREEN);
spannableString.setSpan(foregroundColorSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

ForegroundColorSpan:ForegroundColorSpan:前景色、つまりテキストに色を付ける、色は緑に設定、開始は4、終了は7、「Eason Chan」で、3つの単語が緑色で表示され、実際の効果を確認します。

ここに画像の説明を挿入

BackgroudColorSpan背景色

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.GREEN);
spannableString.setSpan(backgroundColorSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

BackgroudColorSpan:ForegroundColorSpanと同様に、テキストの背景に色を付けます

ここに画像の説明を挿入

ClickableSpanクリックイベント

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
ClickableSpan clickableSpan = new ClickableSpan() {
    
    
    @Override
    public void onClick(View widget) {
    
    
        Toast.makeText(MainActivity.this, "如果我是陈奕迅", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void updateDrawState(TextPaint ds) {
    
    
        ds.setUnderlineText(false);
    }
};
spannableString.setSpan(clickableSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
mTextView.setText(spannableString);

ClickableSpan:クリック可能な効果を実現する抽象クラスです。onClickメソッドをオーバーライドしてクリックイベントを実現できます。ここでは、「Eason Chan」という3つの単語をクリックして、トーストを再生します。

ここに画像の説明を挿入

URLSpanハイパーリンク

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
URLSpan urlSpan = new URLSpan("https://www.baidu.com/s?ie=UTF-8&wd=陈奕迅");
spannableString.setSpan(urlSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
mTextView.setText(spannableString);

URLSpan:ClickableSpanから継承されたハイパーリンクの効果を実現するには、クリックしてブラウザにジャンプします

ここに画像の説明を挿入

MaskFilterSpanファジーレリーフ

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
MaskFilterSpan embossMaskFilterSpan =
    new MaskFilterSpan(new EmbossMaskFilter(new float[]{
    
    10, 10, 10}, 0.5f, 1, 1));
spannableString.setSpan(embossMaskFilterSpan, 0, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(1.5f);
spannableString.setSpan(relativeSizeSpan, 0, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
MaskFilterSpan blurMaskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(10, Blur.NORMAL));
spannableString.setSpan(blurMaskFilterSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

MaskFilterSpan:構築メソッドは、パラメーターとしてMaskFilterを受け入れます。これには、
エンボス効果を実現するために、EmbossMaskFilterとBlurMaskFilterEmbossMaskFilterの2つのサブクラスがあります。

EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)
  • 方向:float配列、長さ3の配列スカラー[x、y、z]を定義して、光源の方向を指定します
  • アンビエント:アンビエントライトの明るさ、0〜1
  • 鏡面反射:鏡面反射係数
  • blurRadius:ぼかし半径、> 0である必要があります

BlurMaskFilterはぼかし効果を実現します

BlurMaskFilter(float radius, Blur style)
  • 半径:ぼかし半径
  • スタイル:4つのオプションパラメータがあります
    • BlurMaskFilter.Blur.NORMAL:内側と外側をぼかします
    • BlurMaskFilter.Blur.OUTER:外部ブラー
    • BlurMaskFilter.Blur.INNER:内部ブラー
    • BlurMaskFilter.Blur.SOLID:内側は太字、外側はぼやけています

ここに画像の説明を挿入

RelativeSizeSpanフォントの相対サイズ

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(1.5f);
spannableString.setSpan(relativeSizeSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

RelativeSizeSpan:フォントの相対サイズを設定します。ここではTextViewのサイズの1.5倍に設定されています。画像を参照してください。

ここに画像の説明を挿入

AbsoluteSizeSpan絶対フォントサイズ

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(40, true);
spannableString.setSpan(absoluteSizeSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

AbsoluteSizeSpan:フォントの相対絶対サイズを設定します。40はテキストサイズを意味し、trueは単位が伏角であることを意味し、falseはピクセルを意味します。

ここに画像の説明を挿入

ScaleXSpanフォントのx軸スケーリング

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
ScaleXSpan scaleXSpan= new ScaleXSpan(1.5f);
spannableString.setSpan(scaleXSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

ScaleXSpan:フォントのx軸ズームを設定します。1.5はx軸ズームが1.5倍であることを意味し、効果は図に示されています。

ここに画像の説明を挿入

StyleSpanスタイル

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
StyleSpan boldSpan = new StyleSpan(Typeface.BOLD);
StyleSpan italicSpan = new StyleSpan(Typeface.ITALIC);
StyleSpan boldItalicSpan = new StyleSpan(Typeface.BOLD_ITALIC);
spannableString.setSpan(boldSpan, 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(italicSpan, 2, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(boldItalicSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

StyleSpan:斜体、太字などのテキストスタイルを設定します
ここに画像の説明を挿入

TypefaceSpanフォント

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
TypefaceSpan monospace = new TypefaceSpan("monospace");
TypefaceSpan serif = new TypefaceSpan("serif");
TypefaceSpan sans_serif = new TypefaceSpan("sans-serif");
spannableString.setSpan(monospace, 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(serif, 2, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sans_serif, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

TypefaceSpan:モノスペース、セリフ、サンセリフなどのテキストフォントタイプを設定します。

ここに画像の説明を挿入

TextAppearanceSpanテキストの外観

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(this, android.R.style.TextAppearance_Material);
spannableString.setSpan(textAppearanceSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

TextAppearanceSpan:スタイルリソース設定を介してテキストの外観を設定します。ここではシステムスタイルリソースが使用されます

ここに画像の説明を挿入

UnderlineSpan下線

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableString.setSpan(underlineSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

UnderlineSpan:テキストの下線を設定します。テキストを強調表示するときにこのスパンを使用できます
ここに画像の説明を挿入

取り消し線スパン取り消し線

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableString.setSpan(strikethroughSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

StrikethroughSpan:テキストの取り消し線を設定します

ここに画像の説明を挿入

SuperscriptSpan上付き文字

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
SuperscriptSpan superscriptSpan = new SuperscriptSpan();
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(0.8f);
spannableString.setSpan(relativeSizeSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(superscriptSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

SuperscriptSpan:テキストを上付き文字として設定します

ここに画像の説明を挿入

SubscriptSpan添え字

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
SubscriptSpan subscriptSpan = new SubscriptSpan();
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(0.8f);
spannableString.setSpan(relativeSizeSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(subscriptSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

SubscriptSpan:テキストを下付き文字として設定します

ここに画像の説明を挿入

ImageSpanの写真

SpannableString spannableString = new SpannableString("如果我是陈奕迅");
ImageSpan imageSpan = new ImageSpan(this, R.drawable.ic_eason);
spannableString.setSpan(imageSpan, 4, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTextView.setText(spannableString);

ImageSpan:画像を設定します

ここに画像の説明を挿入

総括する

上記のスパンを要約します

  • ForegroundColorSpan:前景色
  • BackgroundColorSpan:背景色
  • ClickableSpan:抽象クラス、クリック可能な効果、クリックイベントに応答するためのonClickメソッドのオーバーライド
  • URLSpan:ハイパーリンク
  • MaskFilterSpan:EmbossMaskFilterエンボス効果、BlurMaskFilterブラー効果
  • RelativeSpan:テキストの相対サイズ
  • AbsoluteSpan:絶対テキストサイズ
  • ScaleXSpan:x軸ズーム
  • styleSpan:テキストスタイル
  • TypefaceSpan:テキストフォントタイプ
  • TextApearanceSpan:テキストの外観
  • UnderlineSpan:下線
  • StrikeThroughSpan:取り消し線
  • SuperscriptSpan:上付き文字
  • SubscriptSpan:添え字
  • ImageSpan:写真

著者:CharmingWong
リンク:https://www.jianshu.com/p/472fd3e32324
出典:ジェーンの本
は著者が著作権を所有しています。商用の再版の場合は、著者に連絡して許可を求めてください。非商用の再版の場合は、出典を示してください。

おすすめ

転載: blog.csdn.net/yechaoa/article/details/109360081