h5在线编辑_秀堂h5_手机ui设计_答题类h5_h5测试小游戏
当前位置:建站首页 > 新闻资讯 > 最新签约 >

AndroidSpannableString浅谈

发表日期:2020-11-08 04:48文章编辑:jianzhan浏览次数: 标签:    

在运用软件开发全过程常常必须对文字开展解决,例如说对一段叙述文本的在其中一段添加点一下恶性事件,或是对其设定不一样的市场前景色,有哪些方式能够完成规定的作用呐?

例如大家必须完成以下图所显示的作用,将文字:#重磅消息信息#前不久Google释放Android N的第二个开发设计者浏览版(Developer Preview) 解决成第二种或是第三种的方式。

这里写图片描述

依据图中,大家能够选用以下的方式来完成上告规定的实际效果。

例如显示信息实际效果二你可以以能要说,大家能够选用三个TextView来完成,第一个TextView设定不一样的色调,第二个一切正常显示信息內容,第三个解决点一下恶性事件。该方法对图二将会是可以完成的,可是假如第二行里边就会有一部分內容必须开展点一下解决,就较为无法完成了。

针对图三的实际效果所述的方法就难以完成了。务必要对TextView的內容开展解决了!!

除开上边的计划方案,大家还能够选用此外一个种方法来完成,选用html来显示信息,能够即将显示信息的內容变换成html的文件格式,用TextView来开展载入。讲过那么多,大家看来看编码吧!

private void setText() {
 String originText = #重磅消息信息#前不久Google释放Android N的第二个开发设计者浏览版(Developer Preview) 
 String effect1 = font color= #FF0000 #重磅消息信息# /font br 前不久Google释放Android +
  (Developer Preview) /a 
 String effect2 = font color= #303F9F #重磅消息信息# /font 前不久Google释放Android +
  (Developer Preview) /a 
 StringBuilder sb = new StringBuilder(originText);
 sb.append( br br br br 
 sb.append(effect1);
 sb.append( br br br br 
 sb.append(effect2);
 textView.setText(Html.fromHtml(sb.toString()));
 textView.setMovementMethod(LinkMovementMethod.getInstance());
}

提到这,忽然发觉要偏题,只是是Html的完成便可以剖析出许多的专业知识点,但是这儿還是先切合主题风格,先这儿挖一个坑,事后对html开展剖析,查询连接,如今还未完成

总算返回大家的主题风格了,这儿大家选用SpannableString来完成所述的实际效果。编码以下:

private void setSpan() {
 String originText = #重磅消息信息#前不久Google释放Android N的第二个开发设计者浏览版(Developer Preview) 
 SpannableStringBuilder sb = new SpannableStringBuilder(originText);
 sb.append( 
 ).append( 
 ).append( 
 getEffect1Span(sb);
 sb.append( 
 ).append( 
 ).append( 
 getEffect2Span(sb);
 textView.setText(sb);
 textView.setMovementMethod(LinkMovementMethod.getInstance());
private void getEffect1Span(SpannableStringBuilder sb) {
 String source1 = #重磅消息信息# 
 SpannableString span = new SpannableString(source1);
 span.setSpan(new ForegroundColorSpan(getResources().getColor(R.ent)), 0, source1.length(),
 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 sb.append(span);
 sb.append( 
 String source2 = 前不久Google释放Android N的第二个开发设计者浏览版 
 sb.append(source2);
 final String source3 = (Developer Preview) 
 SpannableString clickSpan = new SpannableString(source3);
 clickSpan.setSpan(new ClickableSpan() {
 @Override
 public void onClick(View widget) {
 ToastUtil.showLong(source3);
 }, 0, source3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 sb.append(clickSpan);
private void getEffect2Span(SpannableStringBuilder sb) {
 String source1 = #重磅消息信息#前不久Google释放Android N的第二个开发设计者浏览版 
 SpannableString span = new SpannableString(source1);
 span.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorPrimaryDark)), 0, 6, Spanned
 .SPAN_EXCLUSIVE_EXCLUSIVE);
 sb.append(span);
 final String source2 = (Developer Preview) 
 SpannableString clickSpan = new SpannableString(source2);
 clickSpan.setSpan(new ClickableSpan() {
 @Override
 public void onClick(View widget) {
 ToastUtil.showLong(source2);
 }, 0, source2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 sb.append(clickSpan);
}

所述编码选用了硬编号方法完成,一切正常完成,必须依据要求开展设定。还记得要加上textView.setMovementMethod(LinkMovementMethod.getInstance());来接纳点一下恶性事件。

SpnnableString详细说明

SpannableString承继了SpannableStringInternal,同时完成了CharSequence, GetChars, Spannable三个插口,一切正常解决文字的涵数为setSpan涵数:

public void setSpan(Object what, int start, int end, int flags) {
 super.setSpan(what, start, end, flags);
}

该涵数有四个主要参数,第一个为一个span种类,第二个主要参数为刚开始部位,第三个部位为span的完毕部位,最终一个为flag主要参数。
what能够设定以下种类:

1, AbsoluteSizeSpan 设定文本字体样式的肯定尺寸, 有2个主要参数,第一个是字体样式尺寸,第二个是企业是不是是dip

public AbsoluteSizeSpan(int size, boolean dip) {
 mSize = size;
 mDip = dip;
 }

2,AlignmentSpan 关键设定文字的两端对齐方法,有三种方法一切正常,垂直居中,反过来的方法两端对齐,默认设置完成为Standard

 public Standard(Layout.Alignment align) {
 mAlignment = align;
 }

3,BackgroundColorSpan 设定文本的情况色

private void setfCS(){
 String source1 = #重磅消息信息# 
 SpannableString span = new SpannableString(source1);
 span.setSpan(new BackgroundColorSpan(getResources().getColor(R.ent)), 0, source1.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 textView.setText(span);
}

4,BulletSpan 给文字的刚开始处再加新项目标记。例如前边加一个 .

private void setBSpan() {
 final String source3 = 前不久Google释放Android N的第二个开发设计者浏览版 
 SpannableString bSpan = new SpannableString(source3);
 bSpan.setSpan(new BulletSpan(), 0, source3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 textView.setText(bSpan);
}

5, ClickableSpan 设定文字的点一下恶性事件,要完成onClick涵数,能够复写updateDrawState,设定下横线,或是撤销下横线,还能够设定下横线色调

private void setCS(){
 final String source2 = (Developer Preview) 
 SpannableString clickSpan = new SpannableString(source2);
 clickSpan.setSpan(new ClickableSpan() {
 @Override
 public void onClick(View widget) {
 ToastUtil.showLong(source2);
 }, 0, source2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 textView.setText(clickSpan);
}

6,DrawableMarginSpan 能够设定一个标志,而且能够设定与文本的总宽

private void setDMSpan() {
 final String source3 = (Developer Preview) 
 SpannableString dmSpan = new SpannableString(source3);
 dmSpan.setSpan(new DrawableMarginSpan(getResources().getDrawable(R.mipmap.ic_launcher), 30), 0, source3
 .length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 textView.setText(dmSpan);
}

7,DynamicDrawableSpan 设定某段文本被标志更换,必须回到一个drawable

8,EasyEditSpan 当文字更改或是删掉时启用, 比如入下长按能够非常容易删掉一行

private void setEdit() {
 editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
 editText.setSingleLine(false);
 editText.setText( 前不久
Google释放Android N的
第二个开发设计者浏览版 
 editText.setOnLongClickListener(new View.OnLongClickListener() {
 @Override
 public boolean onLongClick(View v) {
 final Layout layout = editText.getLayout();
 final int line = layout.getLineForOffset(editText.getSelectionStart());
 final int start = layout.getLineStart(line);
 final int end = layout.getLineEnd(line);
 editText.getEditableText().setSpan(new EasyEditSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 return true;
}

9,ForegroundColorSpan 设定文本市场前景色

private void setfCS(){
 String source1 = #重磅消息信息# 
 SpannableString span = new SpannableString(source1);
 span.setSpan(new ForegroundColorSpan(getResources().getColor(R.ent)), 0, source1.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
 textView.setText(span);
}

提到这儿我停住来啦。天啦噜,30好几个span,能够去系统软件编码package android.text.style包下查询,那么多,全部人也不好啦。

这里写图片描述
因而先就对于上边的干了一部分样例,以后会专业完成一下每一个span的实际效果。细心了解一个就可以了,别的的全是相近的,大家再次看一下后边的主要参数。

第二主要参数start和第三个主要参数end,表明那时候设定的span功效实际效果的范畴,start表明刚开始部位,end表明完毕部位,第四个主要参数是一个flag标识。这儿关键设定下列的值:

 * Non-0-length spans of type SPAN_INCLUSIVE_EXCLUSIVE expand
 * to include text inserted at their starting point but not at their
 * ending point. When 0-length, they behave like marks.
public static final int SPAN_INCLUSIVE_EXCLUSIVE = SPAN_MARK_MARK;
 * Spans of type SPAN_INCLUSIVE_INCLUSIVE expand
 * to include text inserted at either their starting or ending point.
public static final int SPAN_INCLUSIVE_INCLUSIVE = SPAN_MARK_POINT;
 * Spans of type SPAN_EXCLUSIVE_EXCLUSIVE do not expand
 * to include text inserted at either their starting or ending point.
 * They can never have a length of 0 and are automatically removed
 * from the buffer if all the text they cover is removed.
public static final int SPAN_EXCLUSIVE_EXCLUSIVE = SPAN_POINT_MARK;
 * Non-0-length spans of type SPAN_EXCLUSIVE_INCLUSIVE expand
 * to include text inserted at their ending point but not at their
 * starting point. When 0-length, they behave like points.
public static final int SPAN_EXCLUSIVE_INCLUSIVE = SPAN_POINT_POINT;

常见的便是所述的四个值,这儿大家来各自表述下列:
1. SPAN_INCLUSIVE_EXCLUSIVE表明左闭右开区段 [ )
2. SPAN_INCLUSIVE_INCLUSIVE表明上下全是闭区段 ( )
3. SPAN_EXCLUSIVE_EXCLUSIVE表明上下全是闭区段 [ ]
4. SPAN_EXCLUSIVE_INCLUSIVE表明上下全是闭区段 ( ]

大家再次看来编码,SpannableString的setSpan又再次启用了SpannableStringInternal的setSpan涵数。

/* package */ void setSpan(Object what, int start, int end, int flags) {
 int nstart = start;
 int nend = end;
 checkRange( setSpan , start, end);
 if ((flags Spannable.SPAN_PARAGRAPH) == Spannable.SPAN_PARAGRAPH) {
 if (start != 0 start != length()) {
 char c = charAt(start - 1);
 if (c != 
 throw new RuntimeException(
 PARAGRAPH span must start at paragraph boundary +
 ( + start + follows + c + ) 
 if (end != 0 end != length()) {
 char c = charAt(end - 1);
 if (c != 
 throw new RuntimeException(
 PARAGRAPH span must end at paragraph boundary +
 ( + end + follows + c + ) 
 int count = mSpanCount;
 Object[] spans = mSpans;
 int[] data = mSpanData;
 for (int i = 0; i count; i++) {
 if (spans[i] == what) {
 int ostart = data[i * COLUMNS + START];
 int oend = data[i * COLUMNS + END];
 data[i * COLUMNS + START] = start;
 data[i * COLUMNS + END] = end;
 data[i * COLUMNS + FLAGS] = flags;
 sendSpanChanged(what, ostart, oend, nstart, nend);
 return;
 if (mSpanCount + 1 = mSpans.length) {
 Object[] newtags = ArrayUtils.newUnpaddedObjectArray(
 GrowingArrayUtils.growSize(mSpanCount));
 int[] newdata = new int[newtags.length * 3];
 System.arraycopy(mSpans, 0, newtags, 0, mSpanCount);
 System.arraycopy(mSpanData, 0, newdata, 0, mSpanCount * 3);
 mSpans = newtags;
 mSpanData = newdata;
 mSpans[mSpanCount] = what;
 mSpanData[mSpanCount * COLUMNS + START] = start;
 mSpanData[mSpanCount * COLUMNS + END] = end;
 mSpanData[mSpanCount * COLUMNS + FLAGS] = flags;
 mSpanCount++;
 if (this instanceof Spannable)
 sendSpanAdded(what, nstart, nend);
/* package */ void removeSpan(Object what) {
 int count = mSpanCount;
 Object[] spans = mSpans;
 int[] data = mSpanData;
 for (int i = count - 1; i i--) {
 if (spans[i] == what) {
 int ostart = data[i * COLUMNS + START];
 int oend = data[i * COLUMNS + END];
 int c = count - (i + 1);
 System.arraycopy(spans, i + 1, spans, i, c);
 System.arraycopy(data, (i + 1) * COLUMNS,
 data, i * COLUMNS, c * COLUMNS);
 mSpanCount--;
 sendSpanRemoved(what, ostart, oend);
 return;
}

最先启用了checkRange,分辨了部位的合理合法性,假如start低于end,或是部位下标越境都是抛出去IndexOutOfBoundsException出现异常。

以后分辨了(flags Spannable.SPAN_PARAGRAPH) == Spannable.SPAN_PARAGRAPH是不是相同,这儿假如设定的是所述四个值,这儿不是等的,因此不容易进到该分辨。

设定了count,第一次count为0,设定了spans数字能量数组与data,第一次设定的值是在结构涵数中原始化的值。

由于count为0,因而for循环系统都不会进到

以后分辨了mSpanCount + 1 = mSpans.length,这儿前边为1,后边为0,因而会进到if分辨,最先申请办理了一个3个长短的newtags数字能量数组,一个9个长短的int数字能量数组, 以后开展了2次数据信息复制,将现有的span复制到新申请办理的数字能量数组中,将别的主要参数复制到新的int数字能量数组中。

以后将改为设定的span设定到mSpans数字能量数组中,将别的的主要参数设定到mSpanData,三个主要参数是持续设定的。

最终启用了sendSpanAdded,编码以下:

private void sendSpanAdded(Object what, int start, int end) {
 SpanWatcher[] recip = getSpans(start, end, SpanWatcher.class);
 int n = recip.length;
 for (int i = 0; i i++) {
 recip[i].onSpanAdded((Spannable) this, what, start, end);
}

这一启用了getSpans,回到了一个SpanWatcher数字能量数组,SpanWatcher是一个插口,MultiTapKeyListener, TextKeyListener完成了该类,因而当启用了TextKeyListener或是MultiTapKeyListener会对相对的span开展解决。

这儿仅仅大概的分析了SpannableString,他还必须融合TextView开展剖析,看一下在页面绘图的情况下是如何分析显示信息的。事后有时候间会相继开展分析的。

最终附一个连接,在我分析span的情况下,分析了好多个觉得过多,就检索一下是不是早已有些人分析过,因而这一这儿再加自动跳转连接,假如有著作权或是不许导航栏,请告之,我真删掉。传输门

相关新闻

明明50块1个的LOGO,你居然给我要1W?你是在抢钱

今日是无数奇异生活里平平淡淡的1天,小愉想给大伙儿共享1段大家AE和1位奇异顾客的闲聊纪录...

日期:2020-10-08 浏览次数:169

建立网站选中国香港网络服务器的益处和优点在

搜索引擎优化在如今来讲是适度受我们高度重视的,特别是在是公司,更想要提升网站的方式...

日期:2020-09-25 浏览次数:73

公司网站建站必须留意的细节

在应对公司网站建站的1切难题,1定要思考全面,这样获胜的概率便更大。不可以因为其他公司...

日期:2020-09-20 浏览次数:76

做网站选中国香港服务器的益处和优点在哪儿里

网站的提升在如今来讲是适度受我们高度重视的,特别是公司,更想用提升网站的方式来加上...

日期:2020-09-19 浏览次数:108

照片编写器在手,精美照片统统有!

照片编写是如今人们常常会提到的,很多的地区好像海报、盆友圈、宣传策划单页乃至本人简...

日期:2020-09-18 浏览次数:162

泾河新城区在第五届中西部茶博会推荐茯茶 为公

泾河新城区在中西部茶博大会上推荐茯茶。...

日期:2020-08-29 浏览次数:164