项目作者: yinlingchaoliu

项目描述 :
SpannableString轻松创建,链式调用so easy
高级语言: Java
项目地址: git://github.com/yinlingchaoliu/spanLite.git
创建时间: 2020-01-02T04:41:39Z
项目社区:https://github.com/yinlingchaoliu/spanLite

开源协议:

下载


一、前言

SpannableStringBuilder三方库,github怎么看都不满意,用法不够简洁。
我这边用建造者方式重新写一个,来让写法简答起来。

二、SpanLite让你so easy编写spanBuilder

1、引用依赖
  1. allprojects {
  2. repositories {
  3. maven { url 'https://www.jitpack.io' }
  4. }
  5. }
  6. dependencies {
  7. implementation 'com.github.yinlingchaoliu:spanLite:0.0.1'
  8. }
2、构造SpannableStringBuilder

SpanBuilder提供支持方法

  1. SpannableStringBuilder spanBuilder = SpanBuilder.Builder( "spanBuilder方法" ) //传入文字
  2. .drawTextBackgroundColor( Color.YELLOW )//设置文字背景色
  3. .drawTextBackgroundColor( "#000000" )
  4. .drawTextColor( Color.RED )//设置文字颜色
  5. .drawTextColor( "#000000" )
  6. .drawTypeFaceBold()//设置粗体
  7. .drawTypeFaceItalic()//设置斜体
  8. .drawTypeFaceNormal()//设置正常
  9. .drawTypeFaceBoldItalic()//设置粗体斜体
  10. .drawStrikethrough()//设置删除线
  11. .drawUnderline()//设置下划线
  12. .drawScaleX( 2 )//设置x倍数
  13. .drawBlurMaskFilter( 3, BlurMaskFilter.Blur.INNER )//设置模糊
  14. .drawDynamicDrawable( new DynamicDrawableSpan() {//设置图片
  15. @Override
  16. public Drawable getDrawable() {
  17. Drawable drawable = getResources().getDrawable( R.mipmap.ic_launcher );
  18. drawable.setBounds( 0, 0, 50, 50 );
  19. return drawable;
  20. }
  21. } )
  22. .drawSubscript()//设置下标
  23. .drawSuperscript()//设置上标
  24. .drawTextSizeAbsolute( 30 )//设置绝对字体大小
  25. .drawTextSizeRelative( 40 )//设置相对字体大小
  26. .drawImage( this, R.mipmap.ic_launcher )//设置图片
  27. .drawTextAppearance( this, R.style.AppTheme )//设置文字style
  28. .drawTypeface( "serif" )//设置字体
  29. .drawURL( "tel:18601986749" )//设置url
  30. .setOnClick( new SpanBuilder.Listerner() {//设置监听点击事件
  31. @Override //点击事件
  32. public void onClick(View widget) {
  33. Toast.makeText( MainActivity.this, "kakak", Toast.LENGTH_SHORT ).show();
  34. }
  35. @Override //设置更新属性
  36. public void updateDrawState(TextPaint ds) {
  37. super.updateDrawState( ds );
  38. }
  39. }
  40. ).build();//创建

示例demo

  1. SpanBuilder.Builder( "你好小妹" ).setOnClick( new SpanBuilder.Listerner() {
  2. @Override
  3. public void onClick(View widget) {
  4. Toast.makeText( MainActivity.this, "张三丰也会下山", Toast.LENGTH_SHORT ).show();
  5. }
  6. } ).drawTypeFaceBold().build()
3、链式拼装SpanBuilder
  1. SpanLite.with( spanTextView )
  2. .append(spanBuilder1)
  3. .append(spanBuilder2)
  4. .append(spanBuilder3)
  5. .active()
4、实战演示
  1. SpanLite.with( spanTv )
  2. .append( SpanBuilder.Builder( "你好小妹" ).setOnClick( new SpanBuilder.Listerner() {
  3. @Override
  4. public void onClick(View widget) {
  5. Toast.makeText( MainActivity.this, "张三丰也会下山", Toast.LENGTH_SHORT ).show();
  6. }
  7. } ).drawTypeFaceBold().build() )
  8. .append( SpanBuilder.Builder( "kakakakak" ).setOnClick( new SpanBuilder.Listerner() {
  9. @Override
  10. public void onClick(View widget) {
  11. Toast.makeText( MainActivity.this, "kakak", Toast.LENGTH_SHORT ).show();
  12. }
  13. } ).drawTypeFaceItalic().build() )
  14. .append(SpanBuilder.Builder( "《开户协议》" ).setOnClick( new SpanBuilder.Listerner() {
  15. @Override
  16. public void onClick(View widget) {
  17. Toast.makeText( MainActivity.this, "协议就要花钱", Toast.LENGTH_SHORT ).show();
  18. }
  19. } ).drawTextColor( Color.BLUE ).drawTextBackgroundColor( Color.YELLOW ).drawTypeFaceBold().drawTextSize( 60 )
  20. .build() )
  21. .active();

三、编写框架方法

1、编写思考路径

单一职责:不要将两步封装融为一步,这样耦合在一起的编写不简洁

2、收集所有相关主要的方法
  • SpannableStringBuilder和SpannableString主要通过使用
  • setSpan(Object what, int start, int end, int flags)
    对应的参数:
  • start: 指定Span的开始位置
  • end: 指定Span的结束位置,并不包括这个位置。
  • flags:取值有如下四个

  • Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式

  • Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式
  • Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括
  • Spannable. SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括

  • what: 对应的各种Span,不同的Span对应不同的样式。已知的可用类有:

  • BackgroundColorSpan : 文本背景色
  • ForegroundColorSpan : 文本颜色
  • MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕
  • RasterizerSpan : 光栅效果
  • StrikethroughSpan : 删除线
  • SuggestionSpan : 相当于占位符
  • UnderlineSpan : 下划线
  • AbsoluteSizeSpan : 文本字体(绝对大小)
  • DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。
  • ImageSpan : 图片
  • RelativeSizeSpan : 相对大小(文本字体)
  • ScaleXSpan : 基于x轴缩放
  • StyleSpan : 字体样式:粗体、斜体等
  • SubscriptSpan : 下标(数学公式会用到)
  • SuperscriptSpan : 上标(数学公式会用到)
  • TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)
  • TypefaceSpan : 文本字体
  • URLSpan : 文本超链接
  • ClickableSpan : 点击事件
3、抽象出span简单 工具类

目的:封装就是为了简写,减少不必要重复代码

  1. /**
  2. * span支持工具类
  3. * @author chentong
  4. * @date:2020-1-2
  5. */
  6. final class Util {
  7. public static void setSpan(){
  8. }
  9. }
4、用建造者模式对单一spanBuilder进行模型简化

目的:在工具类基础上简单组合方式

  1. /**
  2. * span建造者模式,职责建造一个子build,便于用户清晰
  3. * @author chentong
  4. * @date:2020-1-2
  5. *
  6. */
  7. public class SpanBuilder {
  8. private SpannableStringBuilder spanBuilder;
  9. private String content;
  10. private SpanBuilder() {
  11. }
  12. private SpanBuilder(String content) {
  13. this.content = content;
  14. spanBuilder = new SpannableStringBuilder( content );
  15. }
  16. public static SpanBuilder Builder(String content) {
  17. return new SpanBuilder( content );
  18. }
  19. }
5、spanLite链式调用拼装

目的:在build基础上,整体拼装方式,为了开发者简单链式调用

  1. /**
  2. * 建造者模式,用于组装完整spanBuild 为textview使用
  3. * @author chentong
  4. * @date:2020-1-2
  5. */
  6. public class SpanLite {
  7. private TextView spanTv;
  8. private SpannableStringBuilder spanBuilder;
  9. private SpanLite() {
  10. }
  11. private SpanLite(TextView textView) {
  12. this.spanTv = textView;
  13. spanBuilder = new SpannableStringBuilder();
  14. }
  15. //加入环境
  16. public static SpanLite with(TextView spanTv) {
  17. return new SpanLite( spanTv );
  18. }
  19. //拼接
  20. public SpanLite append(SpannableStringBuilder spanBuilder) {
  21. this.spanBuilder.append( spanBuilder );
  22. return this;
  23. }
  24. //设置超级span,用来特殊处理
  25. public SpanLite setSpan(Object what, int start, int end, int flags) {
  26. Util.setSpan( spanBuilder, what, start, end, flags );
  27. return this;
  28. }
  29. //生效
  30. public void active() {
  31. Util.setMovementMethod( spanTv );
  32. spanTv.setText( spanBuilder );
  33. Util.setHighlightColor( spanTv );
  34. }
  35. }
6、github开源代码

https://github.com/yinlingchaoliu/spanLite