1. 程式人生 > >實現類似微博內容,@使用者,連結高亮,@使用者和連結可點選跳轉,可展開和收回的 TextView

實現類似微博內容,@使用者,連結高亮,@使用者和連結可點選跳轉,可展開和收回的 TextView

StyleTextView 設定TextView顯示樣式,支援富文字展示:更改部分字型顏色,新增圖示,顯示下劃線等;並且支援顯示類似微博話題,@某使用者,以及字型過多時顯示收起和展開操作等

  1. 封裝SpannableStringBuilder支援富文字顯示,簡化系統API使用,詳見:TextStylePhrase

  • WebUrlPovideStyleData 網址高亮,新增點選
  • MentionUserPovideStyleData @某使用者
  • TownTalkPovideStyleData 話題,內建樣式和微博不同,詳見程式碼,可自行更改
  • 如果需要自定義樣式,可以檢視IPovideStyleData,按照裡面的規則進行編碼,不要實現IPovideStyleData,只需要繼承DefaultPovideStyleDataImp就好了。Demo已經有例項,具體可以檢視NameProideStyleData。
需要在Application中初始化,AppStyleUtils.init(this),這裡主要是用來獲取Resources物件,不然無法使用;
private FlexibleRichTextView mFlexibleRichTextView;
private TextView mContentView;

private int mStatus = 1; // 預設展開

private String sourceText = "《易水歌》風蕭蕭兮易水寒,#V#壯士一去兮不復返";
private String vTag = "#V#";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initView();
    initData();
}

private void initView(){
    mContentView = findViewById(R.id.content_view);
    mFlexibleRichTextView = findViewById(R.id.rich_text_view);
}

private void initData() {
    testStylePhrase();
    showFlexibleRichTextView();
}

protected void testStylePhrase() {
    TextStylePhrase mTextStylePhrase = new TextStylePhrase(sourceText);

    TextStylePhrase.TargetPhraseText phraseText1 = new TextStylePhrase.TargetPhraseText("水寒",
            R.color.colorPrimaryDark, 25, -1);

    TextStylePhrase.TargetPhraseText phraseText2 = new TextStylePhrase.TargetPhraseText("一去",
            R.color.colorAccent, 20, Typeface.BOLD);

    TextStylePhrase.TargetPhraseText phraseText3 = new TextStylePhrase.TargetPhraseText("不復返",
            R.color.color0084FB, 14, Typeface.NORMAL);

    TextStylePhrase.TargetPhraseText phraseText4 = new TextStylePhrase.TargetPhraseText("兮",
            R.color.colorC07703, 12, Typeface.NORMAL);

    mTextStylePhrase.setTargetPhraseTextDatas(phraseText1, phraseText2, phraseText3, phraseText4);

    // 新增下劃線
    mTextStylePhrase.setUnderlineSpan("風蕭蕭兮易水寒");

    // 新增刪除線
    mTextStylePhrase.setStrikethroughSpan("壯士");

    // 改變部分顏色
    mTextStylePhrase.setForegroundColorSpan(R.color.colorFDDA35, "風蕭蕭");

    TextStylePhrase.TextSize imageTextSize = mTextStylePhrase.getTextSize(vTag);
    Drawable drawable = getResources().getDrawable(R.drawable.public_icon_v);
    mTextStylePhrase.setImageSpan(imageTextSize, drawable);

    mContentView.setText(mTextStylePhrase.getSpannableStringBuilder());
    mContentView.setMovementMethod(LinkMovementMethod.getInstance());
}

private void showFlexibleRichTextView(){
    String content = "南靖#土樓 以建築奇特,南靖#土樓 @小米之家 居多而聞名天下。"
            + "福建對於我來說知道最多的可能就是關於#土樓 的傳說。"
            + "這麼小的孩子不上學在這裡做起了生意,竟然沒有人管。@人民日報 @南方報業 景區門口亂糟糟的,給人感覺一點都不規範。"
            + "奇怪的是這裡有好幾個臨時售票點,而正規的售票點就在旁邊,www.weibo.com 為什麼還要設臨時的,讓人一臉的茫然。"
            + "臨時售票點就攔在去往景區裡面的路口,只允許一輛車通過,手潮一點 的司機不小心 就會撞到邊上。"
            + "很容易出事故,https://www.baidu.com @人民日報 #第一印象 就大打折扣。";

    mFlexibleRichTextView.setText(content, true, mStatus);

    // 內建的三個
    mFlexibleRichTextView.addRichTextStyle(new MentionUserPovideStyleData());
    mFlexibleRichTextView.addRichTextStyle(new TownTalkPovideStyleData());
    mFlexibleRichTextView.addRichTextStyle(new WebUrlPovideStyleData());

    mFlexibleRichTextView.addRichTextStyle(new NameProideStyleData("南靖")); // 自定義
    mFlexibleRichTextView.setOnTagContentClickListenter(new BaseRichTextStyle.OnTagContentClickListenter() {
        @Override
        public void onClick(int style, String text) {
            ToastUtils.show(style + " - " + text);
        }
    });
    mFlexibleRichTextView.setOnFlexibleClickListener(new FlexibleRichTextView.OnFlexibleClickListener() {
        @Override
        public void onClick(int status) {
            mStatus = status;
        }
    });
    mFlexibleRichTextView.showText();
}

在這裡插入圖片描述