作为android中最基本的ui控件,TextView其实异常强大,但是我们开发者对它的使用或许只停留在最基本的方面。现在整理一些比较有用的功能。
图文混排
Span
SpannableString 也是字符串类型,TextView可以直接设置作为文本。
通过setSpan方法为制定下标区间的子字符串设置格式
方法setSpan(Object what,int start,int end,int flags)
第四个参数flags有四种属性值:
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标
- Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,同时包括起始下标和终了下标
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,但都不包括起始下标和终了下标
- Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括终了下标
第一个参数Object what
通过设置第一个参数,可以为TextView设置前景色ForegroundColorSpan,背景色BackgroundColorSpan,相对大小RelativeSizeSpan,字体风格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("为文字设置粗体、斜体风格");
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("为文字设置点击事件");
MyClickableSpan clickableSpan = new MyClickableSpan("http://www.jianshu.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设置setMovementMethod方法,否则没有点击相应,至于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的点击事件的同时也会触发TextView的点击事件
Html.fromHtml()
可以用来解决一些字符转义的情况.比如字符串"集结号//Assembly-number——集合了多项内容的客户端",这里横杠是会转义。
TextView的炫酷效果
通过自定义span还可以实现一些特别的效果,包括颜色渐变,打印机效果等。参考精通Span 轻松玩转各种文本特效
字体对齐
某些情况下,TextView会发生字符不能填满整行,就换行的状况。参考不到100行代码实现左右对齐TextView的思路
修复后
行间距
新增的lineSpacingExtra属性。图为lineSpacingExtra=10dp
2018-12-11_124352.png
字体
Typeface tf = Typeface.createFromAsset(getAssets(), "OpenSans-ExtraBold.ttf");
mTextView.setTypeface(tf);
2018-12-11_132740.png
Autosizing
Autosizing 的带来的效果很简单,就是根据文字的内容,动态修改 TextSize ,而想要使用它,可以通过动态编码和静态的 layout-xml 布局属性的方式使用
- 动态编码,使用 setAutoSizeTextTypeUniformWithConfiguration 中提供的方法
- layout-xml 布局属性
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:lineSpacingExtra="10dp"
android:autoSizeTextType="uniform" //开启自动调整功能
android:autoSizeMinTextSize="12sp" //最小值
android:autoSizeMaxTextSize="100sp" //最大值
android:autoSizeStepGranularity="2sp" //变化的粒度
/>
网友评论