49.Android中各种Span的用法

  • Android中各种Span的用法
    • 前言
    • SpannableStringBuilder
    • URLSpan
    • UnderlineSpan
    • TypefaceSpan
    • TextAppearanceSpan
    • TabStopSpanStandard
    • SuperscriptSpan
    • SubscriptSpan
    • StrikethroughSpan
    • ScaleXSpan
    • StyleSpan
    • RelativeSizeSpan
    • QuoteSpan
    • MaskFilterSpan
    • LeadingMarginSpanStandard
    • ImageSpan
    • IconMarginSpan
    • ForegroundColorSpan
    • DrawableMarginSpan
    • BulletSpan
    • BackgroundColorSpan
    • AlignmentSpanStandard
    • AbsoluteSizeSpan
    • ClickableSpan
    • 源代码


前言

android.text.style包下,有一些Span类,可以提供我们完成一些在TextView中的特殊内容。(比如:部分内容颜色、字体、大小不同等等,更有部分字体可点击。

还有一个SpannableStringBuilder,可以帮助我们设置Span。

底下也有全部的源代码


SpannableStringBuilder

SpannableStringBuilder可以方便我们更好的设置上对应的Span。

设置Span
SpannableStringBuilder.setSpan(Object what, int start, int end, int flags)

这里的Flag表示:start和end是开区间还是闭区间。

Flag:

  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE —— (a,b)

  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE —— (a,b]

  • Spanned.SPAN_INCLUSIVE_EXCLUSIVE —— [a,b)

  • Spanned.SPAN_INCLUSIVE_INCLUSIVE —— [a,b]


URLSpan

功能:点击文字,可以打开一个URL。

URLSpan(String url)

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new URLSpan("https://github.com/CaMnter"), start, sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);// 在单击链接时凡是有要执行的动作,都必须设置MovementMethod对象contentTV.setMovementMethod(LinkMovementMethod.getInstance());// 设置点击后的颜色,这里涉及到ClickableSpan的点击背景contentTV.setHighlightColor(0xff8FABCC);

49.Android中各种Span的用法_第1张图片


UnderlineSpan

功能:设置文字下划线。

UnderlineSpan()

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new UnderlineSpan(), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第2张图片


TypefaceSpan

功能:设置文字字体。

TypefaceSpan(String family)构造方法源码中的注释提示了三种系统字体:

  • monospace

  • serif

  • sans-serif

    /**     * @param family The font family for this typeface.  Examples include     * "monospace", "serif", and "sans-serif".     */    public TypefaceSpan(String family) {        mFamily = family;    }
SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new TypefaceSpan("serif"), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第3张图片


TextAppearanceSpan

功能:设置文字字体、文字样式(粗体、斜体、等等)、文字颜色状态、文字下划线颜色状态等等。

TextAppearanceSpan的三个构造方法

TextAppearanceSpan(Context context, int appearance)

TextAppearanceSpan(Context context, int appearance, int colorList)

TextAppearanceSpan(String family, int style, int size,ColorStateList color, ColorStateList linkColor)

family:

  • monospace

  • serif

  • sans-serif

style:

  • Typeface.NORMAL

  • Typeface.BOLD

  • Typeface.ITALIC

  • Typeface.BOLD_ITALIC

size:表示字体大小(单位px)

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ColorStateList colorStateList = null;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {    colorStateList = this.activity.getColorStateList(R.color.selector_apperarance_span);} else {    try {        colorStateList = ColorStateList.createFromXml(this.activity.getResources(), this.activity.getResources().getXml(R.color.selector_apperarance_span));    } catch (XmlPullParserException | IOException e) {        e.printStackTrace();    }}ssb.setSpan(new TextAppearanceSpan("serif", Typeface.BOLD_ITALIC, this.activity.getResources().getDimensionPixelSize(R.dimen.text_appearance_span), colorStateList, colorStateList), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第4张图片


TabStopSpan.Standard

功能:每行的MarginLeft的偏移量(跟 \t 和 \n 有关系)。

TabStopSpan.Standard(int where)

SpannableStringBuilder ssb = new SpannableStringBuilder(content);String[] subs = content.split(" ");ssb = new SpannableStringBuilder();/** * TabStopSpan. Standard related to \t and \n * TabStopSpan.Standard 跟 \t 和 \n 有关系 */for (String sub1 : subs) {    ssb.append("\t").append(sub1).append(" ");    ssb.append("\n");}ssb.setSpan(new TabStopSpan.Standard(126), 0, ssb.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第5张图片


SuperscriptSpan

功能:文字设置为上标,数学公式中用到。

SuperscriptSpan(Parcel src)

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.replace(start, start + sub.length(), "Save6");Parcel parcel = Parcel.obtain();parcel.writeInt(6);int sixPosition = ssb.toString().indexOf("6");ssb.setSpan(new SuperscriptSpan(parcel), sixPosition, sixPosition + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);parcel.recycle();contentTV.setText(ssb);

49.Android中各种Span的用法_第6张图片


SubscriptSpan

功能:文字设置为下标,化学式中用到。

SubscriptSpan(Parcel src)

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.replace(start, start + sub.length(), "Save6");Parcel parcel = Parcel.obtain();parcel.writeInt(6);int sixPosition = ssb.toString().indexOf("6");ssb.setSpan(new SubscriptSpan(parcel), sixPosition, sixPosition + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);parcel.recycle();contentTV.setText(ssb);

49.Android中各种Span的用法_第7张图片


StrikethroughSpan

功能:文字设置删除线。

StrikethroughSpan()

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new StrikethroughSpan(), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第8张图片


ScaleXSpan

功能:文字横向缩放。

ScaleXSpan(float proportion)

proportion:缩放比例

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new ScaleXSpan(2.0f), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第9张图片


StyleSpan

功能:文字设置样式(正常、粗体、斜体、粗斜体)。

StyleSpan(int style)

style:

  • Typeface.NORMAL

  • Typeface.BOLD

  • Typeface.ITALIC

  • Typeface.BOLD_ITALIC

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第10张图片


RelativeSizeSpan

功能:设置文字相对大小,指相对于文本设定的大小的相对比例。

RelativeSizeSpan(float proportion)

proportion:大小比例。

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new RelativeSizeSpan(6.0f), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第11张图片


QuoteSpan

功能:设置文字左侧显示引用样式(一条竖线)。

QuoteSpan(@ColorInt int color)

color:竖线的颜色。

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new QuoteSpan(0xff000000), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第12张图片


MaskFilterSpan

功能:设置文字模糊效果和浮雕效果。

MaskFilterSpan(MaskFilter filter)

MaskFilter:

  • BlurMaskFilter: 模糊效果

  • EmbossMaskFilter: 浮雕效果

SpannableStringBuilder ssb = new SpannableStringBuilder(content);MaskFilterSpan embossMaskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{3, 3, 9}, 3.0f, 12, 16));ssb.setSpan(embossMaskFilterSpan, start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);String you = "you";int indexYou = content.indexOf(you);MaskFilterSpan blurMaskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(3, BlurMaskFilter.Blur.OUTER));ssb.setSpan(blurMaskFilterSpan, indexYou, indexYou + you.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第13张图片


LeadingMarginSpan.Standard

功能:设置文本缩进。

LeadingMarginSpan.Standard(int first, int rest)

first:首行的 margin left 偏移量。
rest:其他行的 margin left 偏移量。

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.append(" ")        .append(ssb.toString())        .append(ssb.toString())        .append(ssb.toString());ssb.setSpan(new LeadingMarginSpan.Standard(96, 36), 0, ssb.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第14张图片


ImageSpan

功能:文本插入图片。

构造方法很多:

ImageSpan(Context context, Bitmap b)

ImageSpan(Context context, Bitmap b, int verticalAlignment)

ImageSpan(Drawable d)

ImageSpan(Drawable d, int verticalAlignment)

ImageSpan(Drawable d, String source)

ImageSpan(Drawable d, String source, int verticalAlignment)

ImageSpan(Context context, Uri uri)

ImageSpan(Context context, Uri uri, int verticalAlignment)

ImageSpan(Context context, @DrawableRes int resourceId)

ImageSpan(Context context, @DrawableRes int resourceId, int verticalAlignment)

verticalAlignment:

  • ImageSpan.ALIGN_BOTTOM

  • ImageSpan.ALIGN_BASELINE

source:图片的本机路径String。( xxx/xxx/xxx.jpg )

uri:图片的本机uri。

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.replace(start, start + sub.length(), " Save");ssb.setSpan(new ImageSpan(this.activity, R.mipmap.ic_mm_1, ImageSpan.ALIGN_BASELINE), 0, 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第15张图片


IconMarginSpan

功能:文本插入图片+Margin。

IconMarginSpan(Bitmap b, int pad)

pad:margin偏移量。

SpannableStringBuilder ssb = new SpannableStringBuilder(content);Bitmap bitmap = BitmapFactory.decodeResource(this.activity.getResources(), R.mipmap.ic_mm_1);ssb.setSpan(new IconMarginSpan(bitmap, 60), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//bitmap.recycle();contentTV.setText(ssb);

49.Android中各种Span的用法_第16张图片


ForegroundColorSpan

功能:设置文字颜色。

ForegroundColorSpan(@ColorInt int color)

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new ForegroundColorSpan(0xff303F9F), start, start + sub.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第17张图片


DrawableMarginSpan

功能:文本插入图片+Margin。

DrawableMarginSpan(Drawable b, int pad)

pad:margin偏移量。

SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new DrawableMarginSpan(ResourcesUtil.getDrawable(this.activity, R.mipmap.ic_mm_1), 6), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);contentTV.setText(ssb);

49.Android中各种Span的用法_第18张图片


BulletSpan

功能:类似于HTML中的

  • 标签的圆点效果。

    BulletSpan(int gapWidth, int color)

    gapWidth:圆点与文本的间距。

    color:圆点颜色。

    SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new BulletSpan(66, 0xff303F9F), start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);contentTV.setText(ssb);

    49.Android中各种Span的用法_第19张图片


    BackgroundColorSpan

    功能:设置背景色。

    BackgroundColorSpan(int color)

    SpannableStringBuilder ssb = new SpannableStringBuilder(content);String you = "you";int indexYou = content.indexOf(you);ssb.setSpan(new BackgroundColorSpan(0x2f303F9F), start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);ssb.setSpan(new BackgroundColorSpan(0x2fFF4081), indexYou, indexYou + you.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);contentTV.setText(ssb);

    49.Android中各种Span的用法_第20张图片


    AlignmentSpan.Standard

    功能:设置文字对齐方式。

    AlignmentSpan.Standard(Layout.Alignment align)

    align:

    • Layout.Alignment.ALIGN_NORMAL

    • Layout.Alignment.ALIGN_OPPOSITE

    • Layout.Alignment.ALIGN_CENTER

    • Layout.Alignment.ALIGN_LEFT

    • Layout.Alignment.ALIGN_RIGHT

    SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), 0, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);contentTV.setText(ssb);

    AbsoluteSizeSpan

    功能:设置文字绝对大小。

    AbsoluteSizeSpan(int size, boolean dip)

    size:默认单位为px。
    dip:true为size的单位是dip,false为px。

    SpannableStringBuilder ssb = new SpannableStringBuilder(content);ssb.setSpan(new AbsoluteSizeSpan(26, true), start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);contentTV.setText(ssb);

    49.Android中各种Span的用法_第21张图片


    ClickableSpan

    功能:文字可点击。

    抽象类,需要自己扩展实现。

    ClickableSpanNoUnderline

    public class ClickableSpanNoUnderline extends ClickableSpan {    private static final String TAG = "ClickableSpan";    private static final int NO_COLOR = -206;    private int color;    private OnClickListener onClickListener;    public ClickableSpanNoUnderline(int color, OnClickListener onClickListener) {        super();        this.color = color;        this.onClickListener = onClickListener;    }    public ClickableSpanNoUnderline(OnClickListener onClickListener) {        this(NO_COLOR, onClickListener);    }    /**     * Makes the text underlined and in the link color.     *     * @param ds     */    @Override    public void updateDrawState(@NonNull TextPaint ds) {        super.updateDrawState(ds);        // 设置文字颜色        if (this.color == NO_COLOR) {            ds.setColor(ds.linkColor);        } else {            ds.setColor(this.color);        }        ds.clearShadowLayer();        // 去除下划线        ds.setUnderlineText(false);        ds.bgColor = Color.TRANSPARENT;    }    /**     * Performs the click action associated with this span.     *     * @param widget widget     */    @Override    public void onClick(View widget) {        if (this.onClickListener != null) {            this.onClickListener.onClick(widget, this);        } else {            Log.w(TAG, "listener was null");        }    }    /**     * 回调接口,回调自身的onClick事件     * 告诉外部 是否被点击     */    public interface OnClickListener<T extends ClickableSpanNoUnderline> {        /**         * ClickableSpan被点击         *         * @param widget widget         * @param span   span         */        void onClick(View widget, T span);    }}

    SpanClickableSpan

    private class SpanClickableSpan extends ClickableSpanNoUnderline {    private String urlString;    public String getUrlString() {        return urlString;    }    public void setUrlString(String urlString) {        this.urlString = urlString;    }    public SpanClickableSpan(int color, OnClickListener onClickListener) {        super(color, onClickListener);    }    public SpanClickableSpan(OnClickListener onClickListener) {        super(onClickListener);    }}

    开始使用

    SpannableStringBuilder ssb = new SpannableStringBuilder(content);SpanClickableSpan spanClickableSpan = new SpanClickableSpan(0xffFF4081, new ClickableSpanNoUnderline.OnClickListener() {    /**     * ClickableSpan被点击     *     * @param widget widget     * @param span   span     */    @Override    public void onClick(View widget, SpanClickableSpan span) {        String urlString = span.getUrlString();        if (TextUtils.isEmpty(urlString)) return;        Uri uri = Uri.parse(urlString);        Context context = widget.getContext();        Intent intent = new Intent(Intent.ACTION_VIEW, uri);        intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());        try {            context.startActivity(intent);        } catch (ActivityNotFoundException e) {            Log.w("URLSpan", "Activity was not found for intent, " + intent.toString());        }    }});spanClickableSpan.setUrlString("https://github.com/CaMnter");ssb.setSpan(spanClickableSpan, start, start + sub.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);contentTV.setText(ssb);// 在单击链接时凡是有要执行的动作,都必须设置MovementMethod对象contentTV.setMovementMethod(LinkMovementMethod.getInstance());// 设置点击后的颜色,这里涉及到ClickableSpan的点击背景contentTV.setHighlightColor(0x00000000);

    49.Android中各种Span的用法_第22张图片


    源代码

    可以去github里的NO.32。当然也求Star,T T。

    更多相关文章

    1. Android获取图片Uri/path
    2. 【Android】图片切换组件ImageSwitcher的运用
    3. Android 创建圆形背景图片
    4. Android 更改TextView文字颜色(引用Drawable颜色常数及背景色)
    5. Android base64 上传图片
    6. Android显示网络图片相关实现方法浅谈
    7. android 中Drawable跟Bitmap转换及常用于图片相关操作方法 - And
    8. android带图片的AlertDialog和文件管理器(代码)
    9. android GridView实现选中图片放大。

    随机推荐

    1. Android(安卓)对话框Activity去除白色边
    2. [android] No resource found that match
    3. AndroidManifest.xml Activity 属性说明
    4. android中Socket的使用
    5. Android中Handler引起的内存泄露
    6. Android(安卓)Interface Definition Lang
    7. Android(安卓)PopWindow使用
    8. Android日期时间格式国际化
    9. android
    10. Android(安卓)Launcher3一些默认修改