这是在一个TetView中显示不同样式文本的工具类
public class SpannableWrap {
public static SpannableConfig setText(String text) {
return new SpannableConfig(text);
}
public static class SpannableConfig {
private List<SpannableString> mSpannableStringList;
private SpannableString mCurrentString;
private boolean mNeedMoveMethod = false;
private SpannableConfig(String text) {
if (mSpannableStringList == null) {
mSpannableStringList = new ArrayList<>();
}
mCurrentString = new SpannableString(text);
mSpannableStringList.add(mCurrentString);
}
public SpannableConfig append(String text) {
mCurrentString = new SpannableString(text);
mSpannableStringList.add(mCurrentString);
return this;
}
public SpannableConfig textColor(int color) {
ForegroundColorSpan span = new ForegroundColorSpan(color);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig backgroundColor(int color) {
BackgroundColorSpan span = new BackgroundColorSpan(color);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig bold() {
StyleSpan span = new StyleSpan(Typeface.BOLD);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig italic() {
StyleSpan span = new StyleSpan(Typeface.ITALIC);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig bloditalic() {
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig image(@DrawableRes int drawableId, Context context) {
Drawable drawable = context.getResources().getDrawable(drawableId);
image(drawable);
return this;
}
public SpannableConfig image(Drawable drawable) {
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan span = new ImageSpan(drawable);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig relativeSize(float proportion) {
RelativeSizeSpan span = new RelativeSizeSpan(proportion);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig size(int size, boolean isDip) {
AbsoluteSizeSpan span = new AbsoluteSizeSpan(size, isDip);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig sizeSp(int size, Context context) {
AbsoluteSizeSpan span = new AbsoluteSizeSpan(DisplayUtil.sp2px(context, size), false);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig underline() {
UnderlineSpan span = new UnderlineSpan();
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return this;
}
public SpannableConfig url(URLType type, String url) {
URLSpan span = new URLSpan(type + url);
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mNeedMoveMethod = true;
return this;
}
public SpannableConfig onclick(View.OnClickListener onClickListener, boolean underLine) {
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(View widget) {
onClickListener.onClick(widget);
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ds.linkColor);
ds.setUnderlineText(underLine);
}
};
mCurrentString.setSpan(span, 0, mCurrentString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mNeedMoveMethod = true;
return this;
}
public void into(TextView textView) {
textView.setText("");
for (SpannableString string : mSpannableStringList) {
textView.append(string);
}
if (mNeedMoveMethod) {
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
public enum URLType {
TELEPHONE("tal:"),
EMAIL("mailto:"),
WEB(""),
SMS("sms:"),
MMS("mms:"),
MAP("geo:");
private String mMethod;
URLType(String method) {
mMethod = method;
}
@Override
public String toString() {
return mMethod;
}
}
}
使用方式
SpannableWrap.setText(mView.getResources().getString(R.string.yue)).sizeSp(12, mView.getContext()).
textColor(ContextCompat.getColor(mView.getContext(), R.color.text_black))
.append(String.format(Locale.CHINA, "%.01f", total)).sizeSp(25, mView.getContext()
).textColor(ContextCompat.getColor(mView.getContext(), R.color.text_orange))
.append(mView.getResources().getString(R.string.yuan)).sizeSp(12, mView.getContext()).
textColor(ContextCompat.getColor(mView.getContext(), R.color.text_black))
.into(mTvPrice);