下面列出了android.text.style.MaskFilterSpan#android.text.style.SubscriptSpan 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private void handleEndTag(CharacterStyle style) {
if (style instanceof URLSpan) {
mOut.append("</a>");
} else if (style instanceof TypefaceSpan) {
mOut.append("</font>");
} else if (style instanceof ForegroundColorSpan) {
mOut.append("</font>");
} else if (style instanceof BackgroundColorSpan) {
mOut.append("</font>");
} else if (style instanceof AbsoluteSizeSpan) {
mOut.append("</font>");
} else if (style instanceof StrikethroughSpan) {
mOut.append("</strike>");
} else if (style instanceof SubscriptSpan) {
mOut.append("</sub>");
} else if (style instanceof SuperscriptSpan) {
mOut.append("</sup>");
} else if (style instanceof UnderlineSpan) {
mOut.append("</u>");
} else if (style instanceof BoldSpan) {
mOut.append("</b>");
} else if (style instanceof ItalicSpan) {
mOut.append("</i>");
}
}
private void handleEndTag(CharacterStyle style) {
if (style instanceof URLSpan) {
mOut.append("</a>");
} else if (style instanceof TypefaceSpan) {
mOut.append("</font>");
} else if (style instanceof ForegroundColorSpan) {
mOut.append("</font>");
} else if (style instanceof BackgroundColorSpan) {
mOut.append("</font>");
} else if (style instanceof AbsoluteSizeSpan) {
mOut.append("</font>");
} else if (style instanceof StrikethroughSpan) {
mOut.append("</strike>");
} else if (style instanceof SubscriptSpan) {
mOut.append("</sub>");
} else if (style instanceof SuperscriptSpan) {
mOut.append("</sup>");
} else if (style instanceof UnderlineSpan) {
mOut.append("</u>");
} else if (style instanceof BoldSpan) {
mOut.append("</b>");
} else if (style instanceof ItalicSpan) {
mOut.append("</i>");
}
}
private void handleEndTag(CharacterStyle style) {
if (style instanceof URLSpan) {
mOut.append("</a>");
} else if (style instanceof TypefaceSpan) {
mOut.append("</font>");
} else if (style instanceof ForegroundColorSpan) {
mOut.append("</font>");
} else if (style instanceof BackgroundColorSpan) {
mOut.append("</font>");
} else if (style instanceof AbsoluteSizeSpan) {
mOut.append("</font>");
} else if (style instanceof StrikethroughSpan) {
mOut.append("</strike>");
} else if (style instanceof SubscriptSpan) {
mOut.append("</sub>");
} else if (style instanceof SuperscriptSpan) {
mOut.append("</sup>");
} else if (style instanceof UnderlineSpan) {
mOut.append("</u>");
} else if (style instanceof BoldSpan) {
mOut.append("</b>");
} else if (style instanceof ItalicSpan) {
mOut.append("</i>");
}
}
public static SpannableString getSubscriptSpan() {
SpannableString spannableString = new SpannableString("水分子化学式为H20");
SubscriptSpan subscriptSpan = new SubscriptSpan();
RelativeSizeSpan sizeSpan = new RelativeSizeSpan(0.7f);
spannableString.setSpan(subscriptSpan, 8, 9, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(sizeSpan, 8, 9, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
return spannableString;
}
@Test
public void subscript_should_add_only_one_span() {
spanBuilder.style(range, EZ.SUBSCRIPT)
.apply();
verify((SpanEZ) spanBuilder, times(1))
.addSpan(isA(TargetRange.class), isA(SubscriptSpan.class));
}
/**
* @see SubscriptSpan#SubscriptSpan()
*/
public static Span subscript() {
return new Span(new SpanBuilder() {
@Override
public Object build() {
return new SubscriptSpan();
}
});
}
public TextDecorator setSubscript(final String... texts) {
int index;
for (String text : texts) {
if (content.contains(text)) {
index = content.indexOf(text);
decoratedContent.setSpan(new SubscriptSpan(), index, index + text.length(), flags);
}
}
return this;
}
@Override
public void onSpanClick(SpanButton v) {
View view=richEdit.findFocus();
BaseRichEditText editText;
if(view instanceof BaseRichEditText){
editText=(BaseRichEditText)view;
}else {
return;
}
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true);
int color=typedValue.data;
switch (v.getSpan()){
case SpanButton.SPAN_BOLD:editText.toggleBold();if(editText.isBold()){editText.applyStyleSpan(Typeface.BOLD);v.setColor(color);}else {editText.removeSelectionSpan(Typeface.BOLD);v.setColor(0xff757575);}break;
case SpanButton.SPAN_ITALIC:editText.toggleItalic();if(editText.isItalic()){editText.applyStyleSpan(Typeface.ITALIC);v.setColor(color);}else {editText.removeSelectionSpan(Typeface.ITALIC);v.setColor(0xff757575);}break;
case SpanButton.SPAN_STRIKETHROUGH:editText.toggleStrikethrough();if(editText.isStrikethrough()){editText.applySelectionSpan(StrikethroughSpan.class);v.setColor(color);}else {editText.removeSelectionSpan(StrikethroughSpan.class);v.setColor(0xff757575);}break;
case SpanButton.SPAN_UNDERLINE:editText.toggleUnderLine();if(editText.isUnderLine()){editText.applySelectionSpan(UnderlineSpan.class);v.setColor(color);}else {editText.removeSelectionSpan(UnderlineSpan.class);v.setColor(0xff757575);}break;
case SpanButton.SPAN_FOREGROUND:editText.toggleForegroundColor();if(editText.isForegroundColor()){editText.applyColorSpan(ForegroundColorSpan.class,v.getGroundColor());v.setColor(v.getGroundColor());}else {editText.removeSelectionSpan(ForegroundColorSpan.class);v.setColor(0xff757575);}break;
case SpanButton.SPAN_BACKGROUND:editText.toggleBackgroundColor();if(editText.isBackgroundColor()){editText.applyColorSpan(BackgroundColorSpan.class,v.getGroundColor());v.setColor(v.getGroundColor());}else {editText.removeSelectionSpan(BackgroundColorSpan.class);v.setColor(0xff757575);}break;
case SpanButton.SPAN_SUBSCRIPT:editText.toggleSubscript();if(editText.isSubscript()){editText.applyScriptSpan(SubscriptSpan.class);v.setColor(color);}else {editText.removeSelectionSpan(SubscriptSpan.class);v.setColor(0xff757575);}break;
case SpanButton.SPAN_SUPERSCRIPT:editText.toggleSuperscript();if(editText.isSuperscript()){editText.applyScriptSpan(SuperscriptSpan.class);v.setColor(color);}else {editText.removeSelectionSpan(SuperscriptSpan.class);v.setColor(0xff757575);}break;
case SpanButton.SPAN_TODO:richEdit.addTodoLayout((BaseContainer) richEdit.findFocus().getParent().getParent());break;
case SpanButton.SPAN_DOT:richEdit.addDotLayout((BaseContainer) richEdit.findFocus().getParent().getParent());break;
case SpanButton.SPAN_NUMERIC:richEdit.addNumericLayout((BaseContainer) richEdit.findFocus().getParent().getParent());break;
case SpanButton.SPAN_PHOTO:richEdit.addPhotoLayout((BaseContainer) richEdit.findFocus().getParent().getParent());break;
//case SpanButton.SPAN_TEXTSIZE:editText.changeSize();editText.applyRelativeSpan();break;
//case SpanButton.SPAN_BOLD:editText.toggleBold();if(editText.isBold()){editText.applyStyleSpan(Typeface.BOLD);v.setColor(color);}else {editText.removeSelectionSpan(Typeface.BOLD);v.setColor(0xff757575);}break;
}
}
private void processSub( boolean opening, Editable output) {
int len = output.length();
if(opening) {
//output.setSpan(new RelativeSizeSpan(0.5f), len, len, Spannable.SPAN_MARK_MARK);
output.setSpan(new SubscriptSpan(), len, len, Spannable.SPAN_MARK_MARK);
//output.setSpan(new AbsoluteSizeSpan(scriptSize,false), len, len, Spannable.SPAN_MARK_MARK);
} else {
Object obj = getLast(output, SubscriptSpan.class);
int where = output.getSpanStart(obj);
output.removeSpan(obj);
//obj = getLast(output, RelativeSizeSpan.class);
//output.removeSpan(obj);
if (where != len&&where>=0) {
//output.setSpan(new AbsoluteSizeSpan(scriptSize, false), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
output.setSpan(new RelativeSizeSpan(0.7f), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
output.setSpan(new SubscriptSpan(), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// obj = getLast(output, AbsoluteSizeSpan.class);
// where = output.getSpanStart(obj);
// output.removeSpan(obj);
// if (where != len) {
// output.setSpan(new AbsoluteSizeSpan(scriptSize, false), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// //output.setSpan(new RelativeSizeSpan(0.5f), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// }
}
}
private static void setUpSubscriptSpan(Span span, SpannableString ss, int start, int end) {
if (span.isSubscript()) {
ss.setSpan(
new SubscriptSpan(),
start,
end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("p")) {
endCssStyle(mSpannableStringBuilder);
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("ul")) {
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("li")) {
endLi(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("div")) {
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("span")) {
endCssStyle(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("b")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("em")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("cite")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("dfn")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("i")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("big")) {
end(mSpannableStringBuilder, Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(mSpannableStringBuilder, Small.class, new RelativeSizeSpan(0.8f));
} else if (tag.equalsIgnoreCase("font")) {
endFont(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("blockquote")) {
endBlockquote(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("tt")) {
end(mSpannableStringBuilder, Monospace.class, new TypefaceSpan("monospace"));
} else if (tag.equalsIgnoreCase("a")) {
endA(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("u")) {
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("s")) {
end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(mSpannableStringBuilder, Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(mSpannableStringBuilder, Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
endHeading(mSpannableStringBuilder);
} else if (mTagHandler != null) {
mTagHandler.handleTag(false, tag, mSpannableStringBuilder, mReader);
}
}
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("p")) {
handleP(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("div")) {
handleP(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("b")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("em")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("cite")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("dfn")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("i")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("big")) {
end(mSpannableStringBuilder, Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(mSpannableStringBuilder, Small.class, new RelativeSizeSpan(0.8f));
} else if (tag.equalsIgnoreCase("font")) {
endFont(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("blockquote")) {
handleP(mSpannableStringBuilder);
end(mSpannableStringBuilder, Blockquote.class, new QuoteSpan());
} else if (tag.equalsIgnoreCase("tt")) {
end(mSpannableStringBuilder, Monospace.class,
new TypefaceSpan("monospace"));
} else if (tag.equalsIgnoreCase("a")) {
endA(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("u")) {
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("ins")) {
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(mSpannableStringBuilder, Strike.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("s")) {
end(mSpannableStringBuilder, Strike.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(mSpannableStringBuilder, Strike.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(mSpannableStringBuilder, Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(mSpannableStringBuilder, Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
handleP(mSpannableStringBuilder);
endHeader(mSpannableStringBuilder);
} else if (mTagHandler != null) {
mTagHandler.handleTag(false, tag, mSpannableStringBuilder, mReader);
}
}
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("p")) {
endCssStyle(mSpannableStringBuilder);
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("ul")) {
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("li")) {
endLi(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("div")) {
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("span")) {
endCssStyle(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
// end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
end(mSpannableStringBuilder, Bold.class, new JerryBoldSpan());
} else if (tag.equalsIgnoreCase("b")) {
end(mSpannableStringBuilder, Bold.class, new JerryBoldSpan());
} else if (tag.equalsIgnoreCase("em")) {
end(mSpannableStringBuilder, Italic.class, new JerryItalicSpan());
} else if (tag.equalsIgnoreCase("cite")) {
end(mSpannableStringBuilder, Italic.class, new JerryItalicSpan());
} else if (tag.equalsIgnoreCase("dfn")) {
end(mSpannableStringBuilder, Italic.class, new JerryItalicSpan());
} else if (tag.equalsIgnoreCase("i")) {
end(mSpannableStringBuilder, Italic.class, new JerryItalicSpan());
} else if (tag.equalsIgnoreCase("big")) {
end(mSpannableStringBuilder, Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(mSpannableStringBuilder, Small.class, new RelativeSizeSpan(0.8f));
} else if (tag.equalsIgnoreCase("font")) {
endFont(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("blockquote")) {
endBlockquote(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("tt")) {
end(mSpannableStringBuilder, Monospace.class, new TypefaceSpan("monospace"));
} else if (tag.equalsIgnoreCase("a")) {
endA(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("u")) {
end(mSpannableStringBuilder, Underline.class, new JerryUnderlineSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(mSpannableStringBuilder, Strikethrough.class, new JerryStrikeThroughSpan());
} else if (tag.equalsIgnoreCase("s")) {
end(mSpannableStringBuilder, Strikethrough.class, new JerryStrikeThroughSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(mSpannableStringBuilder, Strikethrough.class, new JerryStrikeThroughSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(mSpannableStringBuilder, Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(mSpannableStringBuilder, Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
endHeading(mSpannableStringBuilder);
} else if (mTagHandler != null) {
mTagHandler.handleTag(false, tag, mSpannableStringBuilder, mReader);
}
}
/**
* 更新 CharSequence 字符
*/
private void updateCharCharSequence() {
if (mText.length() == 0) return;
int start = mBuilder.length();
if (start == 0 && lineHeight != -1) { // bug of LineHeightSpan when first line
mBuilder.append(Character.toString((char) 2)).append("\n")
.setSpan(new AbsoluteSizeSpan(0), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
start = 2;
}
mBuilder.append(mText);
int end = mBuilder.length();
if (verticalAlign != -1) {
mBuilder.setSpan(new VerticalAlignSpan(verticalAlign), start, end, flag);
}
if (foregroundColor != COLOR_DEFAULT) {
mBuilder.setSpan(new ForegroundColorSpan(foregroundColor), start, end, flag);
}
if (backgroundColor != COLOR_DEFAULT) {
mBuilder.setSpan(new BackgroundColorSpan(backgroundColor), start, end, flag);
}
if (first != -1) {
mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
}
if (quoteColor != COLOR_DEFAULT) {
mBuilder.setSpan(new CustomQuoteSpan(quoteColor, stripeWidth, quoteGapWidth), start, end, flag);
}
if (bulletColor != COLOR_DEFAULT) {
mBuilder.setSpan(new CustomBulletSpan(bulletColor, bulletRadius, bulletGapWidth), start, end, flag);
}
if (fontSize != -1) {
mBuilder.setSpan(new AbsoluteSizeSpan(fontSize, fontSizeIsDp), start, end, flag);
}
if (proportion != -1) {
mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
}
if (xProportion != -1) {
mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
}
if (lineHeight != -1) {
mBuilder.setSpan(new CustomLineHeightSpan(lineHeight, alignLine), start, end, flag);
}
if (isStrikethrough) {
mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
}
if (isUnderline) {
mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
}
if (isSuperscript) {
mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
}
if (isSubscript) {
mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
}
if (isBold) {
mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
}
if (isItalic) {
mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
}
if (isBoldItalic) {
mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
}
if (fontFamily != null) {
mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
}
if (typeface != null) {
mBuilder.setSpan(new CustomTypefaceSpan(typeface), start, end, flag);
}
if (alignment != null) {
mBuilder.setSpan(new AlignmentSpan.Standard(alignment), start, end, flag);
}
if (clickSpan != null) {
mBuilder.setSpan(clickSpan, start, end, flag);
}
if (url != null) {
mBuilder.setSpan(new URLSpan(url), start, end, flag);
}
if (blurRadius != -1) {
mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(blurRadius, style)), start, end, flag);
}
if (shader != null) {
mBuilder.setSpan(new ShaderSpan(shader), start, end, flag);
}
if (shadowRadius != -1) {
mBuilder.setSpan(new ShadowSpan(shadowRadius, shadowDx, shadowDy, shadowColor), start, end, flag);
}
if (spans != null) {
for (Object span : spans) {
mBuilder.setSpan(span, start, end, flag);
}
}
}
/**
* 为文字设置下标
* @return
*/
public SpanUtils setSubscriptSpan(){
SubscriptSpan subscriptSpan = new SubscriptSpan();
span.setSpan(subscriptSpan, startIndex, endIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
return this;
}
public static Node subscript(Object... nodes) {
return new SpanNode(new SubscriptSpan(), nodes);
}
@Override public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end) {
builder.setSpan(new SubscriptSpan(), start, end, 33);
builder.setSpan(new RelativeSizeSpan(0.8f), start, end, 33);
}
public void handleTagNode(TagNode node, SpannableStringBuilder builder,
int start, int end, SpanStack spanStack) {
spanStack.pushSpan(new SubscriptSpan(), start, end);
}
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("p")) {
endCssStyle(tag, mSpannableStringBuilder);
endBlockElement(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("ul")) {
endBlockElement(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("li")) {
endLi(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("div")) {
endBlockElement(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("span")) {
endCssStyle(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
end(tag, mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("b")) {
end(tag, mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("em")) {
end(tag, mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("cite")) {
end(tag, mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("dfn")) {
end(tag, mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("i")) {
end(tag, mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("big")) {
end(tag, mSpannableStringBuilder, Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(tag, mSpannableStringBuilder, Small.class, new RelativeSizeSpan(0.8f));
} else if (tag.equalsIgnoreCase("font")) {
endFont(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("blockquote")) {
endBlockquote(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("tt")) {
end(tag, mSpannableStringBuilder, Monospace.class, new TypefaceSpan("monospace"));
} else if (tag.equalsIgnoreCase("a")) {
endA(tag, mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("u")) {
end(tag, mSpannableStringBuilder, Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(tag, mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("s")) {
end(tag, mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(tag, mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(tag, mSpannableStringBuilder, Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(tag, mSpannableStringBuilder, Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
endHeading(tag, mSpannableStringBuilder);
} else if (mTagHandler != null) {
mTagHandler.handleTag(false, tag, null, mSpannableStringBuilder, mReader);
}
}
private void applySpannableTo(final Slice slice, SpannableString finalString, int start, int end) {
if (slice.isSubscript()) {
finalString.setSpan(new SubscriptSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (slice.isSuperscript()) {
finalString.setSpan(new SuperscriptSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (slice.isStrike()) {
finalString.setSpan(new StrikethroughSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if (slice.isUnderline()) {
finalString.setSpan(new UnderlineSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// set click on text
if (slice.getOnTextClick() != null) {
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.TRANSPARENT);
ds.setUnderlineText(slice.isUnderline());
}
@Override
public void onClick(View view) {
view.invalidate();
slice.getOnTextClick().onTextClick(view, slice);
}
};
finalString.setSpan(clickableSpan, start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setMovementMethod(LinkMovementMethod.getInstance());
}
// TODO: 27/08/17 QuoteSpan Spannable
if (slice.getImageResource() != 0) {
finalString.setSpan(new ImageSpan(context, slice.getImageResource())
, start
, end
, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
new Slice.Builder("").setImageResource(0);
}
if (slice.isRounded())
finalString.setSpan(new RoundedBackgroundSpan(slice.getBackgroundColor(), slice.getTextColor(),
slice.getCornerRadius()), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (slice.isCircle())
finalString.setSpan(new CircleBackgroundSpan(slice.getBackgroundColor(), slice.getTextColor(),
slice.getCircleRadius()), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//https://stackoverflow.com/a/33336650/1293313 for rounded corner
//url span
/* if (slice.isUrl())
finalString.setSpan(new URLSpan(finalString.toString()), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
*/
// style
finalString.setSpan(new StyleSpan(slice.getStyle()), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// absolute text size
finalString.setSpan(new AbsoluteSizeSpan(slice.getTextSize()), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// relative text size
finalString.setSpan(new RelativeSizeSpan(slice.getTextSizeRelative()), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// text color
finalString.setSpan(new ForegroundColorSpan(slice.getTextColor()), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// background color
if (slice.getBackgroundColor() != -1) {
finalString.setSpan(new BackgroundColorSpan(slice.getBackgroundColor()), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("p")) {
endCssStyle(mSpannableStringBuilder);
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("ul")) {
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("li")) {
endLi(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("div")) {
endBlockElement(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("span")) {
endCssStyle(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("b")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("em")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("cite")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("dfn")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("i")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("big")) {
end(mSpannableStringBuilder, Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(mSpannableStringBuilder, Small.class, new RelativeSizeSpan(0.875f));
} else if (tag.equalsIgnoreCase("font")) {
endFont(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("blockquote")) {
endBlockquote(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("tt")) {
end(mSpannableStringBuilder, Monospace.class, new TypefaceSpan("monospace"));
} else if (tag.equalsIgnoreCase("a")) {
endA(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("u")) {
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("s")) {
end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(mSpannableStringBuilder, Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(mSpannableStringBuilder, Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(mSpannableStringBuilder, Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
endHeading(mSpannableStringBuilder);
} else if (mTagHandler != null) {
mTagHandler.handleTag(false, tag, mSpannableStringBuilder, mReader);
}
}
public TextDecorator setSubscript(final int start, final int end) {
checkIndexOutOfBoundsException(start, end);
decoratedContent.setSpan(new SubscriptSpan(), start, end, flags);
return this;
}
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr();
} else if (tag.equalsIgnoreCase("p")) {
handleP();
} else if (tag.equalsIgnoreCase("div")) {
endDiv();
} else if (tag.equalsIgnoreCase("ul")) {
endList(false);
} else if (tag.equalsIgnoreCase("ol")) {
endList(true);
} else if (tag.equalsIgnoreCase("li")) {
endList();
} else if (tag.equalsIgnoreCase("strong")) {
end(Bold.class, new BoldSpan());
} else if (tag.equalsIgnoreCase("b")) {
end(Bold.class, new BoldSpan());
} else if (tag.equalsIgnoreCase("em")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("cite")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("dfn")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("i")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("big")) {
end(Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(Small.class, new RelativeSizeSpan(0.8f));
} else if (tag.equalsIgnoreCase("font")) {
endFont();
} else if (tag.equalsIgnoreCase("blockquote")) {
handleP();
end(Blockquote.class, new QuoteSpan());
} else if (tag.equalsIgnoreCase("a")) {
endAHref();
} else if (tag.equalsIgnoreCase("u")) {
end(Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
handleP();
endHeader();
} else if (sIgnoreTags.contains(tag.toLowerCase(Locale.getDefault()))) {
mIgnoreContent = false;
}
}
private void handleEndTag(String tag) {
if (tag.equalsIgnoreCase("br")) {
handleBr();
} else if (tag.equalsIgnoreCase("p")) {
handleP();
} else if (tag.equalsIgnoreCase("div")) {
endDiv();
} else if (tag.equalsIgnoreCase("ul")) {
endList(false);
} else if (tag.equalsIgnoreCase("ol")) {
endList(true);
} else if (tag.equalsIgnoreCase("li")) {
endList();
} else if (tag.equalsIgnoreCase("strong")) {
end(Bold.class, new BoldSpan());
} else if (tag.equalsIgnoreCase("b")) {
end(Bold.class, new BoldSpan());
} else if (tag.equalsIgnoreCase("em")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("cite")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("dfn")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("i")) {
end(Italic.class, new ItalicSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(Strikethrough.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("big")) {
end(Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(Small.class, new RelativeSizeSpan(0.8f));
} else if (tag.equalsIgnoreCase("font")) {
endFont();
} else if (tag.equalsIgnoreCase("blockquote")) {
handleP();
end(Blockquote.class, new QuoteSpan());
} else if (tag.equalsIgnoreCase("a")) {
endAHref();
} else if (tag.equalsIgnoreCase("u")) {
end(Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
handleP();
endHeader();
} else if (sIgnoreTags.contains(tag.toLowerCase(Locale.getDefault()))) {
mIgnoreContent = false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spannable);
ButterKnife.bind(this);
SpannableString spannableString = new SpannableString("前景色背景色相对大小删除线下划线" +
"上标小上标下标粗体斜体显示图片点击超链接");
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#0099EE"));
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.parseColor("#AC00FF30"));
RelativeSizeSpan relativeSizeSpan = new RelativeSizeSpan(2f);
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
UnderlineSpan underlineSpan = new UnderlineSpan();
SuperscriptSpan superscriptSpan = new SuperscriptSpan();
RelativeSizeSpan relativeSizeSpan2 = new RelativeSizeSpan(0.5f);
SubscriptSpan subscriptSpan = new SubscriptSpan();
StyleSpan styleSpan_B = new StyleSpan(Typeface.BOLD);
StyleSpan styleSpan_I = new StyleSpan(Typeface.ITALIC);
ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(SpannableActivity.this, "点击", Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
// 文字不变色
ds.setUnderlineText(false);
}
};
URLSpan urlSpan = new URLSpan("http://www.sdwfqin.com");
spannableString.setSpan(foregroundColorSpan, 0, 3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(backgroundColorSpan, 3, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan, 6, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(strikethroughSpan, 10, 13, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(underlineSpan, 13, 16, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(superscriptSpan, 16, 21, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan2, 18, 21, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(subscriptSpan, 21, 23, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(styleSpan_B, 23, 25, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(styleSpan_I, 25, 27, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(imageSpan, 29, 31, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(clickableSpan, 31, 33, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(urlSpan, 33, 36, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spanString.setMovementMethod(LinkMovementMethod.getInstance());
// 点击背景色
// spanString.setHighlightColor(Color.parseColor("#36969696"));
// 可以点击
spanString.setText(spannableString);
SpannableStringBuilder builder = new SpannableStringBuilder("哈哈哈");
builder.setSpan(foregroundColorSpan, 0, 3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
builder.append("lalala");
// 注意:如果使用toString()方法设置的样式就没有了
spanBuilder.setText(builder);
}
public SimpleText subscript() {
for (Range range : rangeList) {
setSpan(new SubscriptSpan(), range.from, range.to, SPAN_MODE);
}
return this;
}
public void removeSpan(Object what,int start,int end) {
int s = getEditableText().getSpanStart(what);
int e = getEditableText().getSpanEnd(what);
getEditableText().removeSpan(what);
end = end > e ? e : end;
start = start > s ? start : s;
if (what instanceof AbsoluteSizeSpan) {
setSpan(new AbsoluteSizeSpan(
((AbsoluteSizeSpan) what).getSize(), false), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new AbsoluteSizeSpan(
((AbsoluteSizeSpan) what).getSize(), false), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (what instanceof RelativeSizeSpan) {
setSpan(new RelativeSizeSpan(((RelativeSizeSpan) what).getSizeChange()), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new RelativeSizeSpan(((RelativeSizeSpan) what).getSizeChange()), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (what instanceof StyleSpan) {
if (((StyleSpan) what).getStyle() == Typeface.BOLD) {
setSpan(new StyleSpan(Typeface.BOLD), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new StyleSpan(Typeface.BOLD), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (((StyleSpan) what).getStyle() == Typeface.ITALIC) {
setSpan(new StyleSpan(Typeface.ITALIC), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new StyleSpan(Typeface.ITALIC), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else if (what instanceof ForegroundColorSpan) {
setSpan(new ForegroundColorSpan(((ForegroundColorSpan) what).getForegroundColor()), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new ForegroundColorSpan(((ForegroundColorSpan) what).getForegroundColor()), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (what instanceof BackgroundColorSpan) {
setSpan(new ForegroundColorSpan(((BackgroundColorSpan) what).getBackgroundColor()), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new ForegroundColorSpan(((BackgroundColorSpan) what).getBackgroundColor()), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (what instanceof UnderlineSpan) {
setSpan(new UnderlineSpan(), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new UnderlineSpan(), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (what instanceof StrikethroughSpan) {
setSpan(new StrikethroughSpan(), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new StrikethroughSpan(), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (what instanceof SubscriptSpan) {
setSpan(new SubscriptSpan(), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new SubscriptSpan(), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (what instanceof SuperscriptSpan) {
setSpan(new SuperscriptSpan(), s, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setSpan(new SuperscriptSpan(), end, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
super.onSelectionChanged(selStart, selEnd);
selStart=selStart<0?0:selStart;
selEnd=selEnd<0?0:selEnd;
if(selStart>selEnd) {
int temp = selEnd;
selEnd = selStart;
selStart = temp;
}
if(length()==0){
return;
}
isUnderLine = getSelectionSpan(UnderlineSpan.class,selStart,selEnd);
isStrikethrough = getSelectionSpan(StrikethroughSpan.class,selStart,selEnd);
isBold = getSelectionSpan(Typeface.BOLD,selStart,selEnd);
isItalic = getSelectionSpan(Typeface.ITALIC,selStart,selEnd);
isSubscript = getSelectionSpan(SubscriptSpan.class,selStart,selEnd);
isSuperscript = getSelectionSpan(SuperscriptSpan.class,selStart,selEnd);
isForegroundColor = getSelectionSpan(ForegroundColorSpan.class,selStart,selEnd);
isBackgroundColor=getSelectionSpan(BackgroundColorSpan.class,selStart,selEnd);
sizeFlag=MEDIUM_TEXT;
RelativeSizeSpan[] spans;
if(selStart==selEnd){
if(selStart>1){
selStart=selStart-1;
spans= getEditableText().getSpans(selStart, selStart+1, RelativeSizeSpan.class);
}else {
spans = getEditableText().getSpans(selStart, selStart, RelativeSizeSpan.class);
}
}else {
spans= getEditableText().getSpans(selStart, selStart+1, RelativeSizeSpan.class);
}
if(spans.length>0){
float size=spans[0].getSizeChange();
if(size==textMultiple[SMALL_TEXT]){
sizeFlag=SMALL_TEXT;
}else if(size==textMultiple[LARGE_TEXT]){
sizeFlag=LARGE_TEXT;
}else {
sizeFlag=MEDIUM_TEXT;
}
}
if(selectionSpanCallback!=null) {
selectionSpanCallback.callback(
isUnderLine,
isStrikethrough,
isBold,
isItalic,
isSubscript,
isSuperscript,
isForegroundColor,
colorFontForeground,
isBackgroundColor,
colorFontBackground,
sizeFlag);
}
}
private void handleEndTag(String tag) {
if (mTagHandler == null || !mTagHandler.handleTag(false, tag,
mSpannableStringBuilder, mReader, null)) {
if (tag.equalsIgnoreCase("br")) {
handleBr(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("p")) {
handleP(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("div")) {
handleP(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("strong")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("b")) {
end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));
} else if (tag.equalsIgnoreCase("em")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("cite")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("dfn")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("i")) {
end(mSpannableStringBuilder, Italic.class, new StyleSpan(Typeface.ITALIC));
} else if (tag.equalsIgnoreCase("big")) {
end(mSpannableStringBuilder, Big.class, new RelativeSizeSpan(1.25f));
} else if (tag.equalsIgnoreCase("small")) {
end(mSpannableStringBuilder, Small.class, new RelativeSizeSpan(0.8f));
} else if (tag.equalsIgnoreCase("font")) {
endFont(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("blockquote")) {
handleP(mSpannableStringBuilder);
end(mSpannableStringBuilder, Blockquote.class, new QuoteSpan());
} else if (tag.equalsIgnoreCase("tt")) {
end(mSpannableStringBuilder, Monospace.class,
new TypefaceSpan("monospace"));
} else if (tag.equalsIgnoreCase("a")) {
endA(mSpannableStringBuilder);
} else if (tag.equalsIgnoreCase("u")) {
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("ins")) {
end(mSpannableStringBuilder, Underline.class, new UnderlineSpan());
} else if (tag.equalsIgnoreCase("strike")) {
end(mSpannableStringBuilder, Strike.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("s")) {
end(mSpannableStringBuilder, Strike.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("del")) {
end(mSpannableStringBuilder, Strike.class, new StrikethroughSpan());
} else if (tag.equalsIgnoreCase("sup")) {
end(mSpannableStringBuilder, Super.class, new SuperscriptSpan());
} else if (tag.equalsIgnoreCase("sub")) {
end(mSpannableStringBuilder, Sub.class, new SubscriptSpan());
} else if (tag.length() == 2 &&
Character.toLowerCase(tag.charAt(0)) == 'h' &&
tag.charAt(1) >= '1' && tag.charAt(1) <= '6') {
handleP(mSpannableStringBuilder);
endHeader(mSpannableStringBuilder);
}
}
}
private void applySpannablesTo(Piece aPiece, SpannableString finalString, int start, int end) {
if(aPiece.subscript) {
finalString.setSpan(new SubscriptSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if(aPiece.superscript) {
finalString.setSpan(new SuperscriptSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if(aPiece.strike) {
finalString.setSpan(new StrikethroughSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
if(aPiece.underline) {
finalString.setSpan(new UnderlineSpan(), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// style
finalString.setSpan(new StyleSpan(aPiece.style), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// absolute text size
finalString.setSpan(new AbsoluteSizeSpan(aPiece.textSize), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// relative text size
finalString.setSpan(new RelativeSizeSpan(aPiece.textSizeRelative), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// text color
finalString.setSpan(new ForegroundColorSpan(aPiece.textColor), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// background color
if(aPiece.backgroundColor != -1) {
finalString.setSpan(new BackgroundColorSpan(aPiece.backgroundColor), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}