1 Star 2 Fork 0

angcyo / DslSpan

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

DslSpan

Android一个强大的自定义span(DslDrawableSpan), 以及一个SpannableStringBuilder使用工具.

本库提供2个自定义span(DslTextSpan DslDrawableSpan) 和一个SpannableStringBuilder工具类DslSpan

DslDrawableSpan

这个类完全自定义继承ReplacementSpan, 功能强大, 使用简便:

  • 支持绘制 替换 原有的文本内容
  • 支持Drawable绘制
  • 支持文本的Gravity属性(类似于TextView中的gravity)
  • 支持宽度的Weight属性(类似于LinearLayout中的weight)
  • 支持margin属性
  • 支持padding属性
  • 支持click点击事件(不影响TextView原有的OnClickListener事件)

支持的属性如下:

/**绘制文本时的文本大小*/
@Px
var textSize: Float = -1f
/**绘制文本时的文本颜色*/
@ColorInt
var textColor: Int = undefined_color
/**文本绘制的重力*/
var textGravity: Int = Gravity.LEFT or Gravity.BOTTOM
/**需要替换显示的文本, 为空则绘制默认append的文本*/
var showText: CharSequence? = null
/**强制指定span的宽度*/
var spanWidth: Int = undefined_int
/**强制指定span的高度*/
var spanHeight: Int = undefined_int
/**限制span的最大宽度*/
var spanMaxWidth: Int = undefined_int
/**span相对于[TextView]的比例, 不支持平分. 需要[DslSpanTextView]支持*/
var spanWeight: Float = undefined_float
/**使用weight计算最大宽度的限制*/
var spanMaxWeight: Float = undefined_float
/**宽度等于高度*/
var widthSameHeight = false
/**填充背景[Drawable], 在最下面绘制*/
var fillBackgroundDrawable: Drawable? = null
/**背景[Drawable], 在文本下面绘制*/
var backgroundDrawable: Drawable? = null
/**前景[Drawable], 在文本上面绘制*/
var foregroundDrawable: Drawable? = null
/**填充的颜色*/
var gradientSolidColor = undefined_color
/**边框的颜色*/
var gradientStrokeColor = undefined_color
/**边框的宽度*/
var gradientStrokeWidth = 1 * dp
/**圆角大小*/
var gradientRadius = 25 * dp
//影响宽度, 背景偏移, 文本偏移
var marginLeft: Int = 0
var marginRight: Int = 0
var marginTop: Int = 0
var marginBottom: Int = 0
//影响宽度, 影响文本与背景的距离
var paddingLeft: Int = 0
var paddingRight: Int = 0
var paddingTop: Int = 0
var paddingBottom: Int = 0
//整体偏移
var offsetX: Float = 0f
var offsetY: Float = 0f
//单独文本偏移
var textOffsetX: Float = 0f
var textOffsetY: Float = 0f
/**单击事件回调, 需要[SpanClickMethod]支持*/
var spanClickAction: ((view: View, span: DslDrawableSpan) -> Unit)? = null

DslTextSpan

这个类组合了系统各个CharacterStyle的样式.

支持的属性如下:

/**文本颜色*/
@ColorInt
var textColor: Int = undefined_color
/**背景颜色*/
@ColorInt
var bgColor: Int = undefined_color
/**字体大小*/
@Px
var textSize: Float = undefined_float
/**字体缩放*/
var relativeSizeScale: Float = undefined_float
/**删除线*/
var deleteLine: Boolean = false
/**下划线*/
var underline: Boolean = false
/**粗体*/
var textBold: Boolean = false
/**斜体*/
var textItalic: Boolean = false
/**x轴缩放*/
var scaleX: Float = undefined_float
/**文本基线偏移*/
var textBaselineShift: Int = 0
/**上标*/
var isSuperscript: Boolean = false
/**下标*/
var isSubscript: Boolean = false
/**首行缩进*/
var leadingFirst: Int = 0
/**其他行缩进*/
var leadingRest: Int = 0
/**多少行算首行*/
var leadingFirstLineCount: Int = 1
/**需要[DslTextView]支持*/
var leadingFirstWeight: Float = undefined_float
var leadingRestWeight: Float = undefined_float
/**单击事件回调, 需要[SpanClickMethod]支持*/
var onClickSpan: ((view: View, span: DslTextSpan) -> Unit)? = null

注意: 如果需要span的点击事件, 请调用SpanClickMethod.install(textView), 方可生效. 如果需要weight的属性的支持,请使用DslSpanTextView替换原来的TextView

DslSpan

这个类是SpannableStringBuilder的工具类, 用于方便添加span.

实战使用如下:

tv(R.id.text1).text = span {
    append("默认无样式的标准文本")
}

tv(R.id.text2).text = span {
    append("系统")
    append("Span") {
        fontSize = 30 * dpi
        foregroundColor = Color.RED
    }
    append("样式") {
        backgroundColor = Color.GREEN
        scaleX = 2f
    }
}

tv(R.id.text3).text = span {
    append("带Drawable")
    drawable {
        backgroundDrawable = resources.getDrawable(R.mipmap.ic_launcher)
    }
    text("自绘Text") {
        textColor = Color.WHITE
        bgColor = Color.BLACK
    }
    drawable {
        showText = "自绘Text, 支持Gravity"
        textColor = Color.WHITE
        spanWidth = ViewGroup.LayoutParams.WRAP_CONTENT
        marginLeft = 20 * dpi
        paddingLeft = 20 * dpi
        paddingRight = 20 * dpi
        textGravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
        backgroundDrawable = ColorDrawable(Color.DKGRAY)
    }
}

tv(R.id.text4).text = span {
    drawable {
        showText = "支持Weight"
        spanWeight = 0.33333333f
        spanHeight = 30 * dpi
        fillBackgroundDrawable = ColorDrawable(Color.RED)
        textGravity = Gravity.CENTER
    }
    drawable {
        showText = "各占三分之一"
        spanWeight = 0.33333333f
        spanHeight = 40 * dpi
        fillBackgroundDrawable = ColorDrawable(Color.GREEN)
        textGravity = Gravity.CENTER
    }
    drawable {
        showText = "1/3"
        spanWeight = 0.33333333f
        spanHeight = 50 * dpi
        fillBackgroundDrawable = ColorDrawable(Color.BLUE)
        textColor = Color.WHITE
        textGravity = Gravity.CENTER
    }
}

tv(R.id.text5).apply {
    SpanClickMethod.install(this)
    setOnClickListener {
        Toast.makeText(this@MainActivity, "点击View", Toast.LENGTH_SHORT).show()
    }

    text = span {
        drawable {
            showText = "支持点击"
            spanWeight = 0.5f
            backgroundDrawable = ColorDrawable(Color.RED)
            textGravity = Gravity.CENTER
        }
        drawable {
            showText = "点我试试?"
            spanWeight = 0.5f
            textSize = 40 * dp
            backgroundDrawable = ColorDrawable(Color.GREEN)
            textGravity = Gravity.CENTER
            textColor = Color.WHITE
            spanClickAction = { view, span ->
                Toast.makeText(this@MainActivity, "点击Span", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

tv(R.id.text6).text = span {
    append("自绘Drawable")
    drawable {
        backgroundDrawable = resources.getDrawable(R.mipmap.ic_launcher)
    }
    drawable {
        foregroundDrawable = resources.getDrawable(R.mipmap.ic_launcher_round)
    }
    drawable {
        backgroundDrawable = resources.getDrawable(R.mipmap.ic_launcher)
        foregroundDrawable = resources.getDrawable(R.mipmap.ic_launcher_round)
    }
}

tv(R.id.text7).text = span {
    append("支持空隙")
    appendSpace(10 * dpi)
    append("空隙大小")
    appendSpace(20 * dpi, Color.RED)
    append("空隙颜色")
    appendSpace(30 * dpi, Color.GREEN)
    append("支持空隙")
    appendSpace(40 * dpi, Color.BLUE)
}

tv(R.id.text8).text = span {
    drawable {
        showText = "支持Margin"
        marginLeft = 20 * dpi
        marginRight = 20 * dpi
        backgroundDrawable = ColorDrawable(Color.RED)
    }
    drawable {
        showText = "支持Padding"
        paddingLeft = 20 * dpi
        paddingRight = 20 * dpi
        backgroundDrawable = ColorDrawable(Color.GREEN)
    }
}

使用JitPack的方式, 引入库.

根目录中的 build.gradle

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

APP目录中的 build.gradle

dependencies {
    implementation 'com.github.angcyo:DslSpan:1.0.1'
}

群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此QQ对话 该死的空格 点此快速加群

开源地址

MIT License Copyright (c) 2019 angcyo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

Android一个强大的自定义span(`DslDrawableSpan`), 以及一个`SpannableStringBuilder`使用工具. 展开 收起
Kotlin
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Kotlin
1
https://gitee.com/angcyo/DslSpan.git
git@gitee.com:angcyo/DslSpan.git
angcyo
DslSpan
DslSpan
master

搜索帮助

14c37bed 8189591 565d56ea 8189591