實現類似微博內容,@使用者,連結高亮,@使用者和連結可點選跳轉,可展開和收回的 TextView
阿新 • • 發佈:2019-02-18
StyleTextView 設定TextView顯示樣式,支援富文字展示:更改部分字型顏色,新增圖示,顯示下劃線等;並且支援顯示類似微博話題,@某使用者,以及字型過多時顯示收起和展開操作等
-
封裝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(); }