美文网首页自定义ViewAndroid技术漫谈技术与人生
用SpannableString打造绚丽多彩的文本显示效果

用SpannableString打造绚丽多彩的文本显示效果

作者: 采蘑菇的里奥马 | 来源:发表于2016-06-06 23:41 被阅读32158次

    引语

    TeXtView大家应该都不陌生,文本展示控件嘛! 就用TextView显示普普通通的文本,OK,很简单,Android入门的都会,没入门的在门缝外看两眼也都会,哈哈,开玩笑。那要是设计在开发需求中要求类似微信聊天表情一样在TextView中插入表情图片呢? 有的小伙伴就会说啦,“TextView添加图片我会啊,不就是drawableLeftdrawableRight嘛!” 嗯 ~ 也行,算是一种方法,可这有一个限制,首先,图片只能在TextView的两端,其次,两端都只能设置一张图片。要是图片要在文本中间呢?无能为力了吧,要是你会使用SpannableString,这个问题也就不难解决了,简直是Just So So。

    所以,不论你是否正在经受以上问题的困扰,亦或是还没有经历到,请驻足仔细耐心的看完这篇简短的文章。不仅能够轻松实现以上设计需求,更能收获其他各种炫酷的效果,也许就能帮助你解决现在你所困扰的问题。

    首先我们先来了解SpannableString

    SpannableString其实和String一样,都是一种字符串类型,同样TextView也可以直接设置SpannableString作为显示文本,不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式。

    setSpan(Object what, int start, int end, int flags)方法需要用户输入四个参数,what表示设置的格式是什么,可以是前景色、背景色也可以是可点击的文本等等,start表示需要设置格式的子字符串的起始下标,同理end表示终了下标,flags属性就有意思了,共有四种属性:

    Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标
    Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,同时包括起始下标和终了下标
    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,但都不包括起始下标和终了下标
    Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括终了下标

    下面我们一一解读几种Span常用的格式:

    • ForegroundColorSpan

    ForegroundColorSpan,为文本设置前景色,效果和TextView的setTextColor()类似,实现方法如下:

    SpannableString spannableString = new SpannableString("设置文字的前景色为淡蓝色");
    ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#0099EE"));
    spannableString.setSpan(colorSpan, 9, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 
    textView.setText(spannableString);
    

    设置的区间是9到字符串的最后,也就是图中“淡蓝色”三字。

    • BackgroundColorSpan

    BackgroundColorSpan,为文本设置背景色,效果和TextView的setBackground()类,实现方法如下:

    SpannableString spannableString = new SpannableString("设置文字的背景色为淡绿色");
    BackgroundColorSpan colorSpan = new BackgroundColorSpan(Color.parseColor("#AC00FF30"));
    spannableString.setSpan(colorSpan, 9, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    
    • RelativeSizeSpan

    RelativeSizeSpan,设置文字相对大小,在TextView原有的文字大小的基础上,相对设置文字大小,实现方法如下:

    SpannableString spannableString = new SpannableString("万丈高楼平地起");
    
    RelativeSizeSpan sizeSpan01 = new RelativeSizeSpan(1.2f);
    RelativeSizeSpan sizeSpan02 = new RelativeSizeSpan(1.4f);
    RelativeSizeSpan sizeSpan03 = new RelativeSizeSpan(1.6f);
    RelativeSizeSpan sizeSpan04 = new RelativeSizeSpan(1.8f);
    RelativeSizeSpan sizeSpan05 = new RelativeSizeSpan(1.6f);
    RelativeSizeSpan sizeSpan06 = new RelativeSizeSpan(1.4f);
    RelativeSizeSpan sizeSpan07 = new RelativeSizeSpan(1.2f);
    
    spannableString.setSpan(sizeSpan01, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(sizeSpan02, 1, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(sizeSpan03, 2, 3, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(sizeSpan04, 3, 4, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(sizeSpan05, 4, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(sizeSpan06, 5, 6, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(sizeSpan07, 6, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    
    • StrikethroughSpan

    StrikethroughSpan,为文本设置中划线,也就是常说的删除线,实现方法如下:

    SpannableString spannableString = new SpannableString("为文字设置删除线");
    StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
    spannableString.setSpan(strikethroughSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    

    看到这有没有小激动,分分钟实现天猫打折优惠效果,有木有?

    • UnderlineSpan

    UnderlineSpan,为文本设置下划线,具体实现方法如下:

    SpannableString spannableString = new SpannableString("为文字设置下划线");
    UnderlineSpan underlineSpan = new UnderlineSpan();
    spannableString.setSpan(underlineSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    
    • SuperscriptSpan

    SuperscriptSpan,设置上标,具体实现方法如下:

    SpannableString spannableString = new SpannableString("为文字设置上标");
    SuperscriptSpan superscriptSpan = new SuperscriptSpan();
    spannableString.setSpan(superscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    

    从效果图可以看出,被设置为上标的文字大小和下面的文本文字大小一样,只要我们稍加修饰,结合RelativeSizeSpan设置小字体文本作为上标,分分钟实现指数公式有木有,再也不用2^2+3^2=13这样缺乏审美的数学公式了,是不是超实用?

    • SubscriptSpan

    SubscriptSpan,设置下标,功能与设置上标类似,不做过多描述,具体实现方法如下:

    SpannableString spannableString = new SpannableString("为文字设置下标");
    SubscriptSpan subscriptSpan = new SubscriptSpan();
    spannableString.setSpan(subscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    
    • StyleSpan

    StyleSpan,为文字设置风格(粗体、斜体),和TextView属性textStyle类似,实现方法如下:

    SpannableString spannableString = new SpannableString("为文字设置粗体、斜体风格");
    StyleSpan styleSpan_B  = new StyleSpan(Typeface.BOLD);
    StyleSpan styleSpan_I  = new StyleSpan(Typeface.ITALIC);
    spannableString.setSpan(styleSpan_B, 5, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(styleSpan_I, 8, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setHighlightColor(Color.parseColor("#36969696"));
    textView.setText(spannableString);
    
    • ImageSpan

    ImageSpan,设置文本图片,实现方法如下:

    SpannableString spannableString = new SpannableString("在文本中添加表情(表情)");
    Drawable drawable = getResources().getDrawable(R.mipmap.a9c);
    drawable.setBounds(0, 0, 42, 42);
    ImageSpan imageSpan = new ImageSpan(drawable);
    spannableString.setSpan(imageSpan, 6, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    

    这一个是不是很炫酷?再加一个解析算法,将文本中特定的文本转换成特定的表情图片,分分钟实现聊天表情显示效果有木有啊朋友们!

    • ClickableSpan

    ClickableSpan,设置可点击的文本,设置这个属性的文本可以相应用户点击事件,至于点击事件用户可以自定义,就像效果图显示一样,用户可以实现点击跳转页面的效果,具体实现方法如下:

    SpannableString spannableString = new SpannableString("为文字设置点击事件");
    MyClickableSpan clickableSpan = new MyClickableSpan("http://www.jianshu.com/users/dbae9ac95c78");
    spannableString.setSpan(clickableSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setHighlightColor(Color.parseColor("#36969696")); 
    textView.setText(spannableString);
    
    /***************************************************************/
    
    class MyClickableSpan extends ClickableSpan {
    
        private String content;
    
        public MyClickableSpan(String content) {
            this.content = content;
        }
    
        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setUnderlineText(false);
        }
    
        @Override
        public void onClick(View widget) {
            Intent intent = new Intent(MainActivity.this, OtherActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("content", content);
            intent.putExtra("bundle", bundle);
            startActivity(intent);
        }
    }
    

    代码中我们自定义MyClickableSpan类,继承至ClickableSpan,并重写其中一些方法。ds.setUnderlineText()控制是否让可点击文本显示下划线,很明显,在上面代码中我选择了false,不显示下滑写。onClick点击事件的具体实现方法写在其中。如上代码,我们重写ClickableSpan的onClick方法实现Activity的跳转效果,并传递跳转数据。

    注意:使用ClickableSpan的文本如果想真正实现点击作用,必须为TextView设置setMovementMethod方法,否则没有点击相应,至于setHighlightColor方法则是控制点击是的背景色。

    • URLSpan

    URLSpan,设置超链接文本,其实聪明的小伙帮在讲到ClickableSpan的时候就能实现超链接文本的效果了,重写onClick点击事件就行,也确实看了URLSpan的源码,URLSpan就是继承自ClickableSpan,也和想象中一样,就是重写了父类的onClick事件,用系统自带浏览器打开链接,具体实现方法如下:

    SpannableString spannableString = new SpannableString("为文字设置超链接");
    URLSpan urlSpan = new URLSpan("http://www.jianshu.com/users/dbae9ac95c78");
    spannableString.setSpan(urlSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setHighlightColor(Color.parseColor("#36969696"));
    textView.setText(spannableString);
    

    URLSpanonClick事件的源码如下:

    @Override
    public void onClick(View widget) {
        Uri uri = Uri.parse(getURL());
        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", "Actvity was not found for intent, " + intent.toString());
        }
    }
    

    除此之外,还有MaskFilterSpan可以实现模糊和浮雕效果,RasterizerSpan可以实现光栅效果,因为以上两个使用频率不高,而且效果也不是很明显,就不做详细说明,有兴趣的小伙伴不妨去试一试。

    SpannableStringBuilder

    应该有不少开发的小伙伴知道StringBuilder,可以使用append()方法实现字符串拼接,非常方便。同样,SpannableString中也有SpannableStringBuilder,顾名思义,就是实现对,SpannableString的一个拼接效果,同样是append()方法,可以实现各种风格效果的SpannableString拼接,非常实用。

    彩蛋

    看了这么多的效果是不是收货满满呢?最后我在附上一个个小小的彩蛋,小伙伴们可以开动脑经想一想是怎么实现的哦! 要是有更好的创意,不妨在评论区留言跟大伙儿分享分享呢!

    github下载地址-内含菜单实现代码

    作者申明:如果文中有表述不当或阐述错误的地方,还望正在看文章的您可以帮忙指出,有疑惑也可以在评论区提问或者私信,期待您的意见和建议,欢迎关注交流。

    相关文章

      网友评论

      • Android小菜鳥:ImageSpan 那里,spannableString.setSpan(imageSpan, 6, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 索引应该是7,9吧。
      • 605a744a7bcb:StyleSpan bold = new StyleSpan(Typeface.BOLD);
        ss.setSpan(bold, 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        ss.setSpan(bold, 5,9, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        设置这个的时候前面的0-2没有效果,会被5-9覆盖,有解决办法么
        605a744a7bcb:StyleSpan bold111 = new StyleSpan(Typeface.BOLD);需要在加一个对象才行:pensive:
      • 43b86d730786:哎呀,之前为了在几个文字后面添加一个红色的*符号,用两个TextView拼接:joy: ,真是笨拙呀。
      • Chauncey_Chen:非常用心的总结~ 感谢
      • 沐小晨曦:来玩了,但是依旧要Mark下。谢谢
      • 唐_夏影:通俗易懂,6到爆炸
      • cjcj125125:大佬,我有个疑问,如果一段文字既要设置颜色又要设置可以点击,该怎么弄个呢?
        比如我们再注册的时候经常会看到一个: 我已阅读并同意《xxx协议》
        我想只用一个checkbox使《xx》的文字变色并且支持点击跳转,用你这个折腾半天没弄明白,还请大佬赐教,灰常感谢!
      • 安然_NEGIER:哇哇哇~好详细呀~而且总结的十分精炼~赞诶
      • Scus:不错 学到了
      • a6393228bea9:感谢作者的分享!受用!
        采蘑菇的里奥马:@分享杰 :smile: 客气 !!
      • 7cd6ed79bacd:👍,学习了!
      • AndYMJ:大佬收下的膝盖
      • 地球是猿的:span的flag你写的有误解
        地球是猿的:@码农小阿飞 关于flags的四种属性,你只是说了样式是否包含起始坐标和终了坐标。给我的理解就是当前设置的样式是否在起始坐标和终了坐标上应用。但我亲自试过后发现不是这样的。flags的属性只是标明后期如果有新text插入insert到这段跨度的前后时,是否应用这段跨度内的样式。
        采蘑菇的里奥马:@地球是猿的 怎么说 ?
      • 3674d0183b56:只看一点就忍不住来点赞了!
        采蘑菇的里奥马:@lopez66 哈哈 再忍不住看看完 耍起来 .
      • ff393885796c:楼主知道不动态的字符串,将指定的其中一些字符改变效果怎么做吗,例如:
        “测试字符串,测试字符串,测试字符串,。。。。”,长度不定,将“测试”的颜色改变,怎么做?
        采蘑菇的里奥马:ForegroundColorSpan 一定要在while循环中, 是每一次都要新建的 .
        采蘑菇的里奥马:@小鱼_3926 你好 你的这个问题可以用Matcher实现,具体如下:

        String string = "测试字符串,测试字符串,测试字符串.....";
        SpannableString spannableString = new SpannableString(string);
        Pattern pattern = Pattern.compile("测试");
        Matcher matcher = pattern.matcher(string);
        while (matcher.find()) {
        ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#FF4FB2FF"));
        spannableString.setSpan(colorSpan, matcher.start(), matcher.end(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        }
      • 35b6ce7a9e86:请问楼主,new ForegroundColorSpan()传入一个int值是代表透明效果吗
        采蘑菇的里奥马:@好看的饭店 您好 传入的int值是color的int值.
      • Dio丶:非常棒,建议来个CharacterStyle子类的使用大全合集~
        采蘑菇的里奥马:@Dio丶 建议不错 哈哈 ~
      • 谁的春春不迷茫:作者,最后一个会动的文字效果咋实现
        采蘑菇的里奥马:demo中有哦 .
      • 857f22027472:相比CSDN,这里似乎更愿意评论,学习了
        采蘑菇的里奥马:@一醉惊尘s_aching_so 哈哈 CSDN的移动端太丑了 而且好像没有推送 所以CSDN基本上评论了也很久才回 .
      • 安卓猿:不错,总结的很详细。 能否 介绍一下 自定义 Span 的用法, 比如 继承 ImageSpan 实现一个 小图片 在 一行文字中 上下居中 的 CenterImageSpan.
      • forevan:楼主有没有试过,如果一个字串中全是空格,这个时候设置下划线显示不出来?
        forevan:@码农小阿飞 就是在实现比如填空题 中间会有几个空 我用的空格进行代替 要求正常设置Clickable 以及下划线 圆角背景等效果 现在来看一串纯空格不顶事:smile:
        采蘑菇的里奥马:您好 这个我去试了一下 还真是这样 . 请问你是需要实现怎么样一个功能吗 ? 可以帮你想想有没有什么办法 .
      • Rave_Tian:mark 项目常用到
        采蘑菇的里奥马:确实很实用 . :grin:
      • 咖啡老师:写的真好,很全。在项目中方便使用,非常感谢
      • 68ca0302f2fa:楼主,你最后一行效果position变化时之前位置的字体大小已经变了,为何自动重置成了默认大小,没有看到你写的重置效果的代码啊。。。
        68ca0302f2fa:我知道了,重新设置了settext,尴尬了。。。:smile:
      • 1a55a69a1496:整理的非常详细,受益很多,你可以把它和html这个类的比较添加商就更完美了
      • 长尾科技:总结的不错
        长尾科技:1、BackgroundColorSpan 背景色
        2、ClickableSpan 文本可点击,有点击事件
        3、ForegroundColorSpan 文本颜色(前景色)
        4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
        5、MetricAffectingSpan 父类,一般不用
        6、RasterizerSpan 光栅效果
        7、StrikethroughSpan 删除线(中划线)
        8、SuggestionSpan 相当于占位符
        9、UnderlineSpan 下划线
        10、AbsoluteSizeSpan 绝对大小(文本字体)
        11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
        12、ImageSpan 图片
        13、RelativeSizeSpan 相对大小(文本字体)
        14、ReplacementSpan 父类,一般不用
        15、ScaleXSpan 基于x轴缩放
        16、StyleSpan 字体样式:粗体、斜体等
        17、SubscriptSpan 下标(数学公式会用到)
        18、SuperscriptSpan 上标(数学公式会用到)
        19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
        20、TypefaceSpan 文本字体
        21、URLSpan 文本超链接
      • 一缸米:setHighlightColor 这个方法设置了但是没有作用
      • 一缸米:非常感谢!
      • 放纵的卡尔:写的很好,学习了,谢谢.
      • fbea7f6104b1:请问这个类支不支持 1234***89 这种写法,找了好久也没找到
        e5021d045bc1: @胡东亚 在代码中判断就可以了呗 String的方法
        采蘑菇的里奥马:@胡东亚 请问具体是需要实现怎么一个功能呢 ?
      • BillBian:Spanned.SPAN_INCLUSIVE_EXCLUSIVE,这几个在不可编辑的view中使用,效果一样。可编辑的不一样。
        采蘑菇的里奥马:@被风追的猪 嗯哼. 不错的补充,我会去试验一下 .
      • BillBian:阿飞,是不是因为小李飞刀而起的名字?
        采蘑菇的里奥马:@被风追的猪 哈哈 ~ 希望技术也是可以如此犀利 . :smile:
        BillBian:@码农小阿飞 第一时间想到小李飞刀中的阿飞:stuck_out_tongue:
        采蘑菇的里奥马:@被风追的猪 我的名字中有一个'飞'字, 我的朋友都叫我小阿飞, 感觉不错, 所以自诩. 哈哈 ~
      • 214d98fa4270:干货!原来都是用笨办法,未曾想Android已经给我提供了这么好用的类。多谢!!
        采蘑菇的里奥马:@ps喾左耳 :grin: 好久没有更新了 . 争取再出新作 ..
      • 下雨天的小白鞋:请问,为什么我每次只匹配到字符串里最后一个子字符串呢?怎么匹配所有的?
        下雨天的小白鞋:@码农小阿飞 额 我找到了
        采蘑菇的里奥马:@下雨天的小白鞋 您好! 我可能没有理解您的意思,能详细描述一下实际情况吗 ?
      • cjcj125125:设置点击后,下滑线怎么去掉?????????????
      • cjcj125125:文字跳动怎么实现的???????????
        采蘑菇的里奥马:@cjcj125125 文末有项目源代码 . :grin:
      • 2fbacac7d3cc:表情那个功能,表情图片不居中是什么原因?
      • 卡机玩:涨知识
        采蘑菇的里奥马:@51069582ab9c :grin:
      • nyzs_n9001:帮大忙了,用起来😘
      • 12250de4c380:很棒,受益匪浅!
      • 3674d0183b56:厉害,有空再来看。。
        采蘑菇的里奥马:@lopez66 哈哈 好的东西看了就得用起来 . :grin:
        3674d0183b56:@lopez66 写得很好,谢谢楼主
        3674d0183b56:@lopez66 结果我现在看完了。。 :joy:
      • 942896f7a038:谢谢,请问可以转载吗
        采蘑菇的里奥马:@942896f7a038 欢迎转载 重在分享 .
      • 02ffd0aa395a:很不错
      • 蜡笔小刘:厉害厉害
      • mrrobot97:受教了。
        采蘑菇的里奥马:@mrrobot97 不敢不敢 !
      • ostea:目测handler定时改变setspan,到文本最后在重置下位子。
        采蘑菇的里奥马:@ostea bingo !
      • 3946264bdd64:富文本
        采蘑菇的里奥马:@欢欢宝宝 嗯哼 !
      • 58c6bd32ab17:感觉用html的写法更方便些哈
        采蘑菇的里奥马:@58c6bd32ab17 怎么耍舒畅就怎么耍 . :grin:
        58c6bd32ab17:@码农小阿飞 不过html还是没楼主的强大,楼主这个想怎么玩就怎么玩了,佩服!
        采蘑菇的里奥马:@58c6bd32ab17 哈哈,当然实现的方法可能会有多种,html也是可以的!
      • 红发_SHANKS:原谅我没想到在哪里用【尴尬脸】。但是蛮好玩的东西,mark
        采蘑菇的里奥马:@壹分Orz 慢慢想 ! :grin:
      • 49d98b36ec4b:好
        采蘑菇的里奥马:@改个名字怎么就这么难 :stuck_out_tongue_closed_eyes:
      • 福临江:很好很赞
        采蘑菇的里奥马:@福临江 嘻嘻,谢谢!
      • ffe3bfb27779:张姿势了。。。
        采蘑菇的里奥马:@Ad716 哈哈,多多支持哦!:grin:
      • 8351ae8a3b5e:之前毕设做音乐播放器的时候一直想实现酷狗的 逐字高亮歌词,那时一直没想到好的解决方法,刚看这文章的时候想,是不是用spanableString可以实现,但是传的是Int貌似也不是那效果?酷狗的歌词是可以一个字一个字的一小部分高亮的
        8351ae8a3b5e:@码农小阿飞 酷狗不只是逐字,是一个字的几分之一
        采蘑菇的里奥马:@rainboweast 用SpannableString能够实现逐字高亮的效果,这个不是问题,问题是要实现逐字高亮的同时要同步歌词。
      • dcff7f89dc1e:不错 很好的文章支持一个
        采蘑菇的里奥马:@苦逼的码农 谢谢!
      • feixiang:涨姿势。
        采蘑菇的里奥马:@dzq_feixiang 哈哈,请多多支持!
      • stevenMvp:不错,最后一个文字效果非常棒,有实现的代码么?
      • EMG:细节把控的很好:+1:
      • lguipeng:文章很棒,总结得很好
        采蘑菇的里奥马:@lguipeng 谢谢,多多支持!
      • JiHyoooo:您好,求问一下第一行那个网址怎么匹配的?
        采蘑菇的里奥马:@JiHyoooo 你好,不好意思,最近一直在忙,源码已经上传到github,地址在文末已经给出,希望能够帮助到你。 :grin:
        JiHyoooo:@码农小阿飞 。。。我都不知道怎么描述了,可以把你做的这个demo代码给我看一下吗?想学习学习。
        采蘑菇的里奥马:@JiHyoooo 你好,请问所谓网址匹配是怎么一个说法 ?
      • ElonYanJ:很全面
        采蘑菇的里奥马:@JohnnyYanE 多多支持啊,我会继续努力的!
      • 包牙齿:你好,我将你写的文章写了个demo,
        地址:https://github.com/baoyachi/SpannableStringDemo
        最后一个文字跳动希望提供点思路,求解。。。
        采蘑菇的里奥马:@包牙齿 demo已经上传到github,地址在文末已经更新,关于文中小彩蛋可以去参看一下。 :grin:
        包牙齿:@码农小阿飞 :heart:
        采蘑菇的里奥马:@包牙齿 哈哈 , demo我去看过 。 至于关于彩蛋中文字跳动的效果,就是通过下标控制字符串单个文字的相对大小,然后在0到length之间一个循环就可以实现了 , 期待加入 !! :grin:
      • 熊猫的脑壳:深度好文啊!感谢作者!之前有用过部分文字变色,但是没怎么总结性的学习过,所以一直迷迷糊糊的
        采蘑菇的里奥马:@熊猫的脑壳 非常高兴能够对你有多帮助,近期会有新文,多多关注,多多支持哦! :grin:
      • 追云_似梦:不错
        采蘑菇的里奥马:@追云_似梦 谢谢,我会继续用心写!
      • yoyochoo:不错不错
        采蘑菇的里奥马:@yoyochoo 多谢支持!!
      • shangjing:不错,学习了 :+1:
        采蘑菇的里奥马:@shangjing :pray: 多多支持!
      • 妙法莲花1234:很有用
        采蘑菇的里奥马:@追风917 多多支持哦!
      • a01c512586a9:继承自CharacterStyle
        采蘑菇的里奥马:@a01c512586a9 Bingo!! :grin:
      • 蜀沙:虽然看不懂,但是好像很有用的样子
        采蘑菇的里奥马:@蜀沙 哈哈,SpannableString 确实是挺实用的,用的巧妙能实现很炫酷的效果。
      • 023e483cd8cd:正需了解
      • 捡淑:马克~
        最后一行的效果是定时重新setSpan实现的吗
        采蘑菇的里奥马:@AlaricNorris 可以试着尝试不同的效果,分享给大家!
        捡淑:@码农小阿飞 :+1: 66666
        采蘑菇的里奥马:@AlaricNorris 是的!
      • 415293c09e43:给力,很喜欢
        采蘑菇的里奥马:@415293c09e43 谢谢 , 多多支持啊 !!
      • MeloDev:涨姿势了
        采蘑菇的里奥马:@MeloDev 多多支持!!
      • moshimoshi:不错,学习了
        采蘑菇的里奥马:@moshimoshi 谢谢,多多支持!!

      本文标题:用SpannableString打造绚丽多彩的文本显示效果

      本文链接:https://www.haomeiwen.com/subject/ajcddttx.html