作為android中最基本的ui控件,TextView其實異常強大,但是我們開發(fā)者對它的使用或許只停留在最基本的方面【景ⅲ現(xiàn)在整理一些比較有用的功能。
圖文混排
Span
SpannableString 也是字符串類型咆畏,TextView可以直接設(shè)置作為文本南捂。
通過setSpan方法為制定下標(biāo)區(qū)間的子字符串設(shè)置格式
方法setSpan(Object what,int start,int end,int flags)
第四個參數(shù)flags有四種屬性值:
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE 從起始下標(biāo)到終了下標(biāo),包括起始下標(biāo)
- Spanned.SPAN_INCLUSIVE_INCLUSIVE 從起始下標(biāo)到終了下標(biāo)旧找,同時包括起始下標(biāo)和終了下標(biāo)
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 從起始下標(biāo)到終了下標(biāo)溺健,但都不包括起始下標(biāo)和終了下標(biāo)
- Spanned.SPAN_EXCLUSIVE_INCLUSIVE 從起始下標(biāo)到終了下標(biāo),包括終了下標(biāo)
第一個參數(shù)Object what
通過設(shè)置第一個參數(shù)钮蛛,可以為TextView設(shè)置前景色ForegroundColorSpan,背景色BackgroundColorSpan鞭缭,相對大小RelativeSizeSpan,字體風(fēng)格StyleSpan,圖片ImageSpan,可點擊ClickableSpan
SpannableString spannableString = new SpannableString("萬丈高樓平地起");
RelativeSizeSpan sizeSpan01 = new RelativeSizeSpan(1.2f);
spannableString.setSpan(sizeSpan01, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
--------------------------------------------------------------------------------------------------------------
SpannableString spannableString = new SpannableString("為文字設(shè)置粗體魏颓、斜體風(fēng)格");
StyleSpan styleSpan_B = new StyleSpan(Typeface.BOLD);
StyleSpan styleSpan_I = new StyleSpan(Typeface.ITALIC);
spannableString.setSpan(styleSpan_B, 5, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(styleSpan_I, 8, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setHighlightColor(Color.parseColor("#36969696"));
textView.setText(spannableString);
--------------------------------------------------------------------------------------------------------------
SpannableString spannableString = new SpannableString("在文本中添加表情(表情)");
Drawable drawable = getResources().getDrawable(R.mipmap.a9c);
drawable.setBounds(0, 0, 42, 42);
ImageSpan imageSpan = new ImageSpan(drawable);
spannableString.setSpan(imageSpan, 6, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
--------------------------------------------------------------------------------------------------------------
SpannableString spannableString = new SpannableString("為文字設(shè)置點擊事件");
MyClickableSpan clickableSpan = new MyClickableSpan("http://www.reibang.com/users/dbae9ac95c78");
spannableString.setSpan(clickableSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.parseColor("#36969696"));
textView.setText(spannableString);
//必須為TextView設(shè)置setMovementMethod方法岭辣,否則沒有點擊相應(yīng),至于setHighlightColor方法則是控制點擊是的背景色甸饱。
class MyClickableSpan extends ClickableSpan {
private String content;
public MyClickableSpan(String content) {
this.content = content;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false); //控制是否讓可點擊文本顯示下劃線
}
@Override
public void onClick(View widget) {
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
Bundle bundle = new Bundle();
bundle.putString("content", content);
intent.putExtra("bundle", bundle);
startActivity(intent);
}
}
但是clickspan的點擊事件的同時也會觸發(fā)TextView的點擊事件
Html.fromHtml()
可以用來解決一些字符轉(zhuǎn)義的情況.比如字符串"集結(jié)號//Assembly-number——集合了多項內(nèi)容的客戶端"沦童,這里橫杠是會轉(zhuǎn)義。
TextView的炫酷效果
通過自定義span還可以實現(xiàn)一些特別的效果叹话,包括顏色漸變偷遗,打印機效果等。參考精通Span 輕松玩轉(zhuǎn)各種文本特效
字體對齊
某些情況下驼壶,TextView會發(fā)生字符不能填滿整行,就換行的狀況氏豌。參考不到100行代碼實現(xiàn)左右對齊TextView的思路
修復(fù)后
行間距
新增的lineSpacingExtra屬性。圖為lineSpacingExtra=10dp
字體
Typeface tf = Typeface.createFromAsset(getAssets(), "OpenSans-ExtraBold.ttf");
mTextView.setTypeface(tf);
Autosizing
Autosizing 的帶來的效果很簡單热凹,就是根據(jù)文字的內(nèi)容泵喘,動態(tài)修改 TextSize 瞭吃,而想要使用它,可以通過動態(tài)編碼和靜態(tài)的 layout-xml 布局屬性的方式使用
- 動態(tài)編碼涣旨,使用 setAutoSizeTextTypeUniformWithConfiguration 中提供的方法
- layout-xml 布局屬性
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:lineSpacingExtra="10dp"
android:autoSizeTextType="uniform" //開啟自動調(diào)整功能
android:autoSizeMinTextSize="12sp" //最小值
android:autoSizeMaxTextSize="100sp" //最大值
android:autoSizeStepGranularity="2sp" //變化的粒度
/>