Android柄Text神器をセットしたSpanableString

4496 ワード

TextViewはAndroidではほとんど一般的なコントロールで、ほとんど隅々に広がっています.TextViewについては技術的な点はありませんが、下線、横断線、TextView部分のフォントにクリックや色背景を設定するなど、プロジェクトで特殊なフォントを処理する必要がある場合があります.これくらいのニーズは難しいことではありませんが、解決策が選べないと本当に長い間振り回される可能性があります.こんなにたくさん言ったのは冒頭の引用にほかならないので、SpanableStringを紹介します.
具体的な分析が必要な技術点はあまり多くありません.まずソースコードを貼って、googleがどのようにこのようなものを定義しているかを見てみましょう.
/**
 * This is the class for text whose content is immutable but to which
 * markup objects can be attached and detached.
 * For mutable text, see {@link SpannableStringBuilder}.
 */

 
以上の内容はAndroid SpanableStringソースコードの注釈から抜粋して、大体の意味は
これは、コンテンツとタグを変更できるテキストクラスです.
ソースの内容はあまり多くありませんが、興味があればソースを調べてみてください.
ソースキーの2つの方法
 
 public void setSpan(Object what, int start, int end, int flags) {}

 public void removeSpan(Object what) {}		
		

我先带大家简单使用下这个控件,然后在来分析,其实说到这里有一个小细节开篇的时候忘记跟大家提起了,就是看到SpanableString,其实还有SpanableStringBuilder,其用法类似,大家可以类比String跟StringBuilder来区别,我在此不多解释了,就像你会有String肯定也会使用StringBuilder,我就不在做重复的解释了,下面先来具体举个例子带大家认识下这个东东。

 

    SpannableString spannableString = new SpannableString("               ");
    ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#009ad6"));
    spannableString.setSpan(colorSpan, 0, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
    ((TextView)findViewById(R.id.mode1)).setText(spannableString);


 
上記のコードで冒頭で述べたように、一部のフォントに色を設定する効果が得られます.では、SpanableStringについて大まかな認識があるうちに、流れを簡単に分析してから、他の使い方をまとめます.
 
個人的にはSpanableStringは特殊な文字列として理解されていますが、Stringとは異なり、彼は上で派手なものを作ることができ、サンプルコードでは4つのステップに分けてこの操作を完了しました.
1.まずnewがSpanableStringオブジェクトを作成し、文字列を初期化します.
2.それからspanの方式で1つのcorSpanオブジェクトを生成して、ここのspanは他のいかなるあなたが設定したい形式に設定することができて、例えば冒頭の下線あるいは線引き、クリック事件はすべてできて、異なるspanオブジェクトに対応して、後で私はみんなに整理します.
3.SpanableStringにspanを設定します.setSpanの4つのパラメータは後でソースコードと組み合わせて分析します.
4.textViewに特殊なスタイルのフォントを設定します.
 
具体的な分析:
上記の手順からもわかりますが、実は特殊なスタイルを設定する肝心な手順は2歩目です.次に、具体的に特殊なスタイルを設定することができます.
よく使われるSpanは大体次の通りです
BackgroundColorSpan :      

ForegroundColorSpan :     

MaskFilterSpan :     ,   (BlurMaskFilter)  

RasterizerSpan :     

StrikethroughSpan :    

SuggestionSpan :       

UnderlineSpan :    

AbsoluteSizeSpan :     (    )

DynamicDrawableSpan :     ,           。

ImageSpan :   

RelativeSizeSpan :     (    )

ScaleXSpan :   x   

StyleSpan :     :  、   

SubscriptSpan :   (       )

SuperscriptSpan :   (       )

TextAppearanceSpan :     (    、  、     )

TypefaceSpan :     

URLSpan :      

ClickableSpan :     

その使い方はサンプルコードの中の様子を当てはめてもよいが,具体的なSpanタイプが異なり,使い方が一致しているにほかならない.
 
3ステップ目で述べたsetSpanの使い方と、4つのパラメータが具体的に表す意味を説明します.まずsetSpanのソースコードを貼ります.
 public void setSpan(Object what, int start, int end, int flags) {
        super.setSpan(what, start, end, flags);
    }

上記のソースコードは私が直接SpanableStringクラスから取り出したもので、
最初のパラメータObject what:このwhatは上で共有した様々なSpanのタイプで、必要に応じて自分で指定します.
2番目の3番目のパラメータint start int end:この2つのパラメータはSpanの開始と終了の位置です.
4番目のパラメータ:int flagパラメータは4のタイプで、それぞれspanが終了した位置にstart、endを含むか含まないかを意味します.
flagsの値は次のとおりです.Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前に含む、後に含まない、すなわち、テキストの前に新しいテキストを挿入するとスタイルが適用され、テキストの後に新しいテキストを挿入してもスタイルは適用されません.Spannable. SPAN_INCLUSIVE_INCLUSIVE:前に含む、後に含む、すなわち、テキストの前に新しいテキストを挿入するとスタイルが適用され、テキストの後に新しいテキストを挿入するとスタイルも適用されます.Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面は含まず、背面は含まないSpannable. SPAN_EXCLUSIVE_INCLUSIVE:前面は含まず、背面は
はい、ここを見て、具体的にどのように特殊で派手なtextviewを設定するかを把握したと思います.他のいろいろなSpanの設定は、コードが同じで、私はコードを繰り返してデモをしません.小さな細部に注意しなければなりません.コードを貼って注意しましょう.ClickableSpanを設定するときは、setMovementMethodを忘れないでください.サンプルコードは次のとおりです.
SpannableString spannableString = new SpannableString("             ");
            ClickableSpan clickableSpan = new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    //TODO         
                    System.out.println("        .....");
                }
            };
            spannableString.setSpan(clickableSpan,0,3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            textView.setText(spannableString);
            textView.setMovementMethod(LinkMovementMethod.getInstance());  // TextView   Span ,   setMovementMethod

           

 
上記の過程について、分析が不十分な点があれば、各位の見官の批判を助けてください.