Android SpannablesStringとSpannablesStringBuilderチュートリアル

13778 ワード

一.ガイド人
1.適用対象
  • SpannablesStringに触れたことのない人
  • 聞いたことがありますが、SpannablesStringを知らない人には慣れていません.

  • 2.チュートリアル構造
  • 概要
  • SpannableString
  • SpannableStringBuilder
  • 実戦部
  • まとめと感想(作者が時間を強要)
  • 二.本文
    1.概要
    SpannablesStringとSpannablesStringBuilderの関係はStringとStringBuilderに似ています.前者は可変ではなく,後者は可変である.だから両者の使い方は基本的に同じです.
    機能は、普通の文字列に色、大きさ、背景などのスタイルと特殊なイベント(クリックイベント)を加えることです.次に、前の例を示します.
    この例は普通ですが、仲間たちはこれがいくつかのTextViewではないかと思っているかもしれません.
    そうです.これがTextViewです.しかし、いくつかではなく、1つで、TextViewだけでこの緑の文字が表示されているのではないでしょうか.の感じは?
    この时、友达が言うかもしれません:“1つのTextView?も简単で、私はhtmlを书いて、colorをプラスして、backgroundの様式をプラスして、それからHtml.fromHtml()を使ってまだ軽くて楽ではありませんて、あなたのこの破れたSpanの何の役に立ちますか!”
    そう、このようにしてこの効果を実現することができますが、htmlのコードがAndroidプロジェクトでハードコーディングされているのは見苦しいと思いませんか.そして私がHtmlにfromHtml()のソースコードの研究によると、この方法には神秘的な点はない(DuangDuangができるものは文字に特技をつけ、ふふ!スタイルを加えることができる).
    mSpannableStringBuilder = new SpannableStringBuilder();
    if (end == start) {
                    mSpannableStringBuilder.removeSpan(obj[i]);
                } else {
                    mSpannableStringBuilder.setSpan(obj[i], start, end, Spannable.SPAN_PARAGRAPH);
                }
    

    上は一部を切り取ったHtmlです.fromHtml()メソッドによって呼び出されるソースコード.注意深い仲間たちはきっと発見したに違いない.この中にSpannablesStringBuilder()が現れた.だからすべてが明らかになった.htmlを解析した後、SpannablesStringBuilderでスタイルを追加したのだ.これを見た仲間たちはSpannablesStringBuilderを使うことを学んだのではないでしょうか!?
    2.SpannableString
    		SpannableString ss=new SpannableString("           ");
            ForegroundColorSpan colorSpan=new ForegroundColorSpan(Color.RED);
            ss.setSpan(colorSpan,0,5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            tv.setText(ss);
    

    使い方はSpannablesStringBuilderと似ていて、簡単に例を挙げて、あまり説明しません.
    3.SpannableStringBuilder
    本章の主役、SpannablesStringの好基友.
    class SpannableStringBuilder implements CharSequence, GetChars, Spannable, Editable,
            Appendable, GraphicsOperations{}
    //      CharSequence Spannable
    //   Spannable,                
    //    CharSequence             ,  TextView setText       CharSequence  
    

    主な2つの方法を見てみましょう
        public SpannableStringBuilder append(CharSequence text) {}
        //      SpannableStringBuilder , StringBuilder append      
    
        public void setSpan(Object what, int start, int end, int flags) {}
    

    スタイルを設定するためのコアメソッド.パラメータ:
  • what各種Span、異なるSpanは異なるスタイルに対応し、具体的には以下の通りである:
  • ForegroundColorSpan:テキストの前景色(テキスト色)を設定する
  • BackgroundColorSpan:背景色を設定
  • AbsoluteSizeSpan:絶対文字サイズを設定し、px単位
  • ClickableSpan:文字にクリックイベントを追加(微信モーメンツコメントリストのユーザーのニックネームクリックイベントのようにこれで実現可能)
  • DynamicDrawableSpan :
  • ImageSpan:文書追加ピクチャ
  • RelativeSizeSpan:相対文字サイズを倍数に設定し、他の文字のサイズに対して
  • StrikethroughSpan:削除線を追加
  • SubscriptSpan:下付き文字
  • を設定する
  • SuperscriptSpan:上付き文字
  • を設定
  • URLSpan:文字設定ハイパーリンク
  • UnderlineSpan:下線を設定
  • startスタイルが有効になった開始位置は、その位置3)endスタイルが終了した位置を含み、その位置は含まれていないので、一連の文字のうち最初の3文字のスタイルを設定した場合start:0,end:3となる.end:2
  • ではなく
  • flagsといういくつかのパラメータの中で最も分かりにくい最も面倒で最もやりにくいパラメータです.主に次の4つの値があります:
  • Spannable.SPAN_EXCLUSIVE_INCLUSIVE:Spanの前に入力した文字にはspanの効果は適用されず、後に入力した文字にはSpanの効果が適用されます.
  • Spannable.SPAN_INCLUSIVE_EXCLUSIVE:Spanの前に入力した文字にはspanの効果を適用し、後に入力した文字にはSpanの効果を適用しません.
  • Spannable.SPAN_INCUJSIVE_INCLUSIVE:Spanの前後に入力した文字にspanの効果を適用します.
  • Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:Span前後に入力した文字前後にspanの効果は適用されません.仲間たちが霧の水をかぶっているように見えますよね.前と後ろでは使いません.何ですか.次の2枚の図は皆さんにこの4つのflagの違いを理解させます.これは同じ文字に同じspanを設定しています.違いはflagの違いです.4つの効果は一毛同じではありませんか.この画像の「zz」はEditTextに入力されていますが、仲間たちは上の4つのflagの紹介に合わせて、理解できたのではないでしょうか.
  •         //    
            final String baseString="       ";
            SpannableStringBuilder sb;
            ForegroundColorSpan span;
    
            sb=new SpannableStringBuilder();
            sb.append(baseString);
            span=new ForegroundColorSpan(Color.RED);
            sb.setSpan(span,2,4,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            et.setText(sb);
    
            sb=new SpannableStringBuilder();
            sb.append(baseString);
            span=new ForegroundColorSpan(Color.RED);
            sb.setSpan(span,2,4,Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
            et2.setText(sb);
    
            sb=new SpannableStringBuilder();
            sb.append(baseString);
            span=new ForegroundColorSpan(Color.RED);
            sb.setSpan(span,2,4,Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            et3.setText(sb);
    
            sb=new SpannableStringBuilder();
            sb.append(baseString);
            span=new ForegroundColorSpan(Color.RED);
            sb.setSpan(span,2,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            et4.setText(sb);
    

    4.エキサイティングな実戦の時
    ForegroundColorSpanの使用:
            SpannableStringBuilder sb=new SpannableStringBuilder();
            sb.append("      ");
            ForegroundColorSpan colorSpan=new ForegroundColorSpan(Color.RED);
            sb.setSpan(colorSpan,0,2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
            colorSpan=new ForegroundColorSpan(Color.GREEN);
            sb.setSpan(colorSpan,2,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
            colorSpan=new ForegroundColorSpan(Color.BLUE);
            sb.setSpan(colorSpan,4,6,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
            tv.setText(sb);
    

    花の緑の最も美しい☺
    ImageSpan:
            SpannableStringBuilder sb=new SpannableStringBuilder();
            sb.append("          ");
            ImageSpan span=new ImageSpan(this,R.mipmap.ic_launcher);
            sb.setSpan(span,0,2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            //         ,                
            tv.setText(sb);
    

    みんなで文字を作ると約束したのに、あなたはこっそり画像に整形して、ふん!
    ClickableSpan:
            SpannableStringBuilder sb=new SpannableStringBuilder();
            sb.append("             ");
            ClickableSpan span=new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    Toast.makeText(MainActivity.this,"     ",Toast.LENGTH_LONG).show();
                }
            };
            sb.setSpan(span,0,2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            tv.setText(sb);
    
            //             ,          
            tv.setMovementMethod(LinkMovementMethod.getInstance());
    

    効果:忘れないでください:tv.setMovementMethod(LinkMovementMethod.getInstance()); とても重要です.
    また、文字設定にイベントをクリックすると、自動的に下線が付けられます.このデフォルトの下線は、次のように削除できます.
        //       ClickableSpan。        
        public abstract class NoLineClickSpan extends ClickableSpan {
            public NoLineClickSpan() {
                super();
            }
            @Override
            public void updateDrawState(TextPaint ds) {
                /**set textColor**/
                ds.setColor(ds.linkColor);
                /**Remove the underline**/
                ds.setUnderlineText(false);
            }
            @Override
            public abstract void onClick(View widget);
        }
    

    紙面が限られているので、ここではこんなに多くのSpanの使用例を紹介します.他のいくつかのSpanの適用方法は、仲間たちに自分で探求してもらいます.結局、自分で勉強するのが速いですか.また、newが次々とspanを出すのは面倒だし、startを手動で計算したり、endを計算したりするのは面倒だと思いますか?簡単な補助類をお勧めします.
    はい、以上は広告の時間です.次は本文に入ります.私が書いた補助ツールクラスを使ってください.gayhubアドレス:github.com/zYinux/spec...このライブラリを使用してスタイルを設定するには、次の手順に従います.
     //  SpecialStyle           
            SpecialStyle style=new SpecialStyle();
            SpecialStringBuilder sb=new SpecialStringBuilder();
    
            //         。     save                   ,      true
            style.setColor(Color.BLACK,false);
            //       
            sb.append("  :",style);
    
            style.setColor(Color.RED,false);
            sb.append("¥99.99  ",style);
    
            //             
            //                
            style.setColor(Color.GREEN,false)
                 .setBackgroundColor(Color.rgb(200,200,200),false)
                    .setClickable(new ClickableStyle.OnClick() {
                @Override
                public void onClick(View widget) {
                    Toast.makeText(MainActivity.this,"    ",Toast.LENGTH_SHORT).show();
                }
            });
            sb.append("    ",style);
    
            // TextView         
            tv.setText(sb.getCharSequence());
            //            ,      ,         
            tv.setMovementMethod(LinkMovementMethod.getInstance());
    

    ずいぶん簡単になったのではないでしょうか.やっとうるさいstart、end、flagを気にしなくてもいいです.具体的な使い方はGitHubに回ってみてください.よろしければ、starさん、ありがとうございます.
    5.時間を無理に追い込む
    皆さん、こんにちは.私はzYinuxと申します.このネット名を取ったのはIT界の大物のプロジェクトLinuxに敬意を表すためです.残念ながら今私はまだ入門したばかりの菜鳥で、自分の努力を通じてもっと高い境地に登ることを望んでいます.これは私が書いた2番目のブログです.前のブログはもう1年前です.これから1ヶ月に1つのブログを出すように努力します.文章はみんなに理解することを望んで、ここの小さい仲間がすでに上の知識をマスターしたことを見ることを望んで、もし小さい仲間が教程の中で間違いと漏れがあることを発見したら、私に連絡して指摘することを歓迎します.QQ交流群:589184413