最近受到大佬的影响,决定来写写东西,记录一下自己平时学习工作中遇到的一些东西。第一次在简书上写东西,逼近还是第一次么,难免还是有一些紧张激动。
俗话说男人就怕太快了,所以希望自己也能多坚持坚持,把写东西这个事情坚持久一点吧。
好了,瞎扯完了,开始。
第一篇就先写一个Android中如何在一个TextView中给文字设置不同的样式吧。
都知道Android开发中用于显示文字最简单的View就是Textview了,调用setText()函数设置文字。如果你需要给同一个TextView中的文字设置不同的样式的话,就可以使用SpannableString这个类来完成。(当然还有很多其他的方式)
SpannableString是什么
/**
* This is the class for text whose content is immutable but to which
* markup objects can be attached and detached.
* For mutable text, see {@link SpannableStringBuilder}.
*/
public class SpannableString
extends SpannableStringInternal
implements CharSequence, GetChars, Spannable
{
public SpannableString(CharSequence source) {
super(source,0, source.length());
}
private SpannableString(CharSequence source,int start,int end) {
super(source, start, end);
}
public static SpannableString valueOf(CharSequence source) {
if (sourceinstanceof SpannableString) {
return (SpannableString) source;
}else {
return new SpannableString(source);
}
}
public void setSpan(Object what,int start,int end,int flags) {
super.setSpan(what, start, end, flags);
}
public void removeSpan(Object what) {
super.removeSpan(what);
}
public final CharSequence subSequence(int start,int end) {
return new SpannableString(this, start, end);
}
}
从SpannableString的源码中可以看出,其实SpannableString,是CharSequence的一种。而原本的CharSequence是一串没有样式的字符串序列。而SpannableString就可以做到在原有的字符串序列的基础上对指定位置的字符进行装饰。我们在给就可以使用setText(SpannableString),SpannableString作为参数,从而达到不同的显示样式。
创建一个SpannableString对象。
SpannableString spannableString = new SpannableString("使用SpannableString设置不同的文字样式");
怎么使用SpannableString设置字体样式
public void setSpan(Object what, int start, int end, int flags) {
super.setSpan(what, start, end, flags);
}
textview.setText(spannableString);
这个方法有四个参数:
-
Object what:对SpannableString进行装饰的span,可以理解成不同的各种样式(常见span有:ForegroundColorSpan,BackgroudColorSpan,ClickableSpan,URLSpan,MaskFilterSpan,RelativeSizeSpan等等,后面回给出集中实例样式)
各种Span
-
int start:使用样式效果的起始下标位置
-
int end: 使用样式效果的结束下标位置
-
int flags:决定开始和结束下标是否包含的标志位。简单点就是一个使用样式的一个区间。这个参数用四个固定的值可以让我们选择
- SPAN_INCLUSIVE_EXCLUSIVE:包括开始下标,但不包括结束下标。区间表示:[start,end)
- SPAN_EXCLUSIVE_INCLUSIVE:不包括开始下标,但包括结束下标。区间表示:(start,end]
- SPAN_INCLUSIVE_INCLUSIVE:既包括开始下标,又包括结束下标。区间表示:[start,end]
- SPAN_EXCLUSIVE_EXCLUSIVE:不包括开始下标,也不包括结束下标。区间表示:(start,end)
不同的Span样式实例
先看一张效果
![](https://img.haomeiwen.com/i11589290/6df4729bf9a466f1.jpeg)
ForegroundColorSpan:前景色,也就是给指定的文字上色。
效果对应上图的第一个TextView
ForegroundColorSpan参数:@ColorInt int color。只需要传入颜色即可
SpannableString spannableString = new SpannableString("使用SpannableString设置不同的文字样式");
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);
spannableString.setSpan(foregroundColorSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv1.setText(spannableString);
BackgroundColorSpan:背景色,也就是给指定的文字的背景上色。
BackgroundColorSpan参数:@ColorInt int color。只需要传入颜色即可
SpannableString spannableString2 = new SpannableString("使用SpannableString设置不同的文字样式");
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.GREEN);
spannableString2.setSpan(backgroundColorSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv2.setText(spannableString2);
MaskFilterSpan:一种模糊效果。
MaskFilterSpan参数:MaskFilter filter。
SpannableString spannableString3 = new SpannableString("使用SpannableString设置不同的文字样式");
MaskFilterSpan embossMaskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{10, 10, 10}, 0.5f, 1, 1));
spannableString3.setSpan(embossMaskFilterSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(1.5f);
spannableString3.setSpan(relativeSizeSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
MaskFilterSpan blurMaskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL));
spannableString3.setSpan(blurMaskFilterSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv3.setText(spannableString3);
而MaskFilter有两个子类:EmbossMaskFilter和BlurMaskFilter
EmbossMaskFilter:实现一种浮雕的效果
public EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius) {
if (direction.length < 3) {
throw new ArrayIndexOutOfBoundsException();
}
native_instance = nativeConstructor(direction, ambient, specular, blurRadius);
}
从EmbossMaskFilter的源码中可以看见它需要4个参数
- float[] direction:一个长度为3的float数组,定义出光源的方向
- float ambient:取值范围0~1,定义环境光的强度
- float specular:反射系数
- float blurRadius:必须大于0,模糊半径
BlurMaskFilter:实现一种模糊的效果
/**
* Create a blur maskfilter.
*
* @param radius The radius to extend the blur from the original mask. Must be > 0.
* @param style The Blur to use
* @return The new blur maskfilter
*/
public BlurMaskFilter(float radius, Blur style) {
native_instance = nativeConstructor(radius, style.native_int);
}
从BlurMaskFilter的源码中可以看见它需要2个参数
- float radius:模糊半径
- Blur style:模糊样式,四个值可选
public enum Blur {
/**
* Blur inside and outside the original border.
*/
NORMAL(0),
/**
* Draw solid inside the border, blur outside.
*/
SOLID(1),
/**
* Draw nothing inside the border, blur outside.
*/
OUTER(2),
/**
* Blur inside the border, draw nothing outside.
*/
INNER(3);
Blur(int value) {
native_int = value;
}
final int native_int;
}
BlurMaskFilter.Blur.NORMAL:内外模糊
BlurMaskFilter.Blur.OUTER:外部模糊
BlurMaskFilter.Blur.INNER:内部模糊
BlurMaskFilter.Blur.SOLID:内部加粗,外部模糊
RelativeSizeSpan:改变字体的相对大小。
SpannableString spannableString4 = new SpannableString("使用SpannableString设置不同的文字样式");
RelativeSizeSpan relativeSizeSpan2 = new RelativeSizeSpan(2f);
spannableString4.setSpan(relativeSizeSpan2, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv4.setText(spannableString4);
ScaleXSpan:相对X轴对字体的宽度进行缩放。
SpannableString spannableString5 = new SpannableString("使用SpannableString设置不同的文字样式");
ScaleXSpan scaleXSpan= new ScaleXSpan(2f);
spannableString5.setSpan(scaleXSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv5.setText(spannableString5);
TextAppearanceSpan:设置文字样式,通过style资源设置。
SpannableString spannableString6 = new SpannableString("使用SpannableString设置不同的文字样式");
TextAppearanceSpan textAppearanceSpan = new TextAppearanceSpan(this, android.R.style.TextAppearance_Material);
spannableString6.setSpan(textAppearanceSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv6.setText(spannableString6);
UnderlineSpan:给文字添加下划线。
SpannableString spannableString7 = new SpannableString("使用SpannableString设置不同的文字样式");
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableString7.setSpan(underlineSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv7.setText(spannableString7);
StrikethroughSpan:给文字添加删除线。
SpannableString spannableString8 = new SpannableString("使用SpannableString设置不同的文字样式");
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableString8.setSpan(strikethroughSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv8.setText(spannableString8);
URLSpan:给文字添加一个超链接,点击跳转至指定的url。
SpannableString spannableString9 = new SpannableString("使用SpannableString设置不同的文字样式");
URLSpan urlSpan = new URLSpan("https://www.baidu.com");
spannableString9.setSpan(urlSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv9.setMovementMethod(LinkMovementMethod.getInstance());
tv9.setText(spannableString9);
clickableSpan:给文字添加一个点击区域。ClickableSpan是一个抽象类,实现可点击效果,操作时可以重写onClick方法实现点击事件
SpannableString spannableString10 = new SpannableString("使用SpannableString设置不同的文字样式");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MyCourseActivity.this, "SpannableString", Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannableString10.setSpan(clickableSpan, 2, 17, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv10.setMovementMethod(LinkMovementMethod.getInstance());
tv10.setText(spannableString10);
(注意:这里我也只是例举了几种简单的效果,还有很多就不一一展示了。同时这些各种各样的Span也是可以组合使用,实现一些比较复杂的样式,一切只需要按照需求进行使用即可。)
网友评论