FillBlankTextView 基于TextView实现填空文本控件。
FillBlankTextView仅支持
AndroidX
- 在XML中,可以使用大多数的TextView的属性
- 在代码中,请使用FillBlankTextView中的textView和editView设置属性样式
- 支持长按复制,xml中添加
android:textIsSelectable
- 连续4个以上的下划线(____)表示一个空,下划线越多,空越长
为防止属性名冲突,添加fbtv前缀
属性 | 值类型 | 默认值 | 说明 |
---|---|---|---|
fbtvBlankTextColor | color | 扫描区外遮罩的颜色 blankTextColor |
|
fbtvBlankTextSelectColor | color | 空文本选中颜色 blankTextSelectColor |
|
fbtvBlankEllipsize | enum | End | 扫描区边角的颜色 blankEllipsize |
fbtvBlankUnderlineColor | color | Black | 空下划线颜色 blankUnderlineColor |
fbtvBlankUnderlineSelectColor | color | Black | 空下划线选中颜色 blankUnderlineSelectColor |
fbtvBlankUnderlineWidth | dimension | 3f | 空下划线宽度 blankUnderlineWidth |
fbtvBlankBackground | drawable | null | 空背景 blankBackground |
fbtvBlankBackgroundOffsetLeft | dimension | 0 | 空背景左偏移,向外为正,向内为负 blankBackgroundOffsetLeft setBlankBackgroundOffset() |
fbtvBlankBackgroundOffsetTop | dimension | 0 | 空背景上偏移,向外为正,向内为负 blankBackgroundOffsetTop setBlankBackgroundOffset() |
fbtvBlankBackgroundOffsetRight | dimension | 0 | 空背景右偏移,向外为正,向内为负 blankBackgroundOffsetRight setBlankBackgroundOffset() |
fbtvBlankBackgroundOffsetBottom | dimension | 0 | 空背景下偏移,向外为正,向内为负 blankBackgroundOffsetBottom setBlankBackgroundOffset() |
Java调用请使用getter/setter
属性 | 值类型 | 默认值 | 说明 |
---|---|---|---|
text | CharSequence | 文本 | |
answerList | List | 答案列表,仅有getter | |
blankTextColor | Int | Color.BLACK | 扫描区外遮罩的颜色 |
blankTextSelectColor | Int | Color.BLACK | 空文本选中颜色 |
blankEllipsize | TruncateAt | TruncateAt.END | 扫描区边角的颜色 |
blankUnderlineColor | Int | Color.BLACK | 空下划线颜色 |
blankUnderlineSelectColor | Int | Color.BLACK | 空下划线选中颜色 |
blankUnderlineWidth | Float | 3f | 空下划线宽度 |
blankBackground | drawable | null | 空背景 |
blankBackgroundOffsetLeft | Int | 0 | 空背景左偏移,向外为正,向内为负 setBlankBackgroundOffset() |
blankBackgroundOffsetTop | Int | 0 | 空背景上偏移,向外为正,向内为负 setBlankBackgroundOffset() |
blankBackgroundOffsetRight | Int | 0 | 空背景右偏移,向外为正,向内为负 setBlankBackgroundOffset() |
blankBackgroundOffsetBottom | Int | 0 | 空背景下偏移,向外为正,向内为负 setBlankBackgroundOffset() |
inputCompleteDelay | Long | 500 | 输入完成延时(毫秒) |
onAnswerChangedListener | null | 答案改变监听器 |
方法 | 说明 |
---|---|
setAnswer(index: Int, answer: String, extra: Any?) |
设置答案 index:空索引 answer:答案 extra:答案附加数据 |
getAnswer(index: Int): String | 获取指定位置答案 index:空索引 |
getAnswerExtra(index: Int): Any? | 获取指定位置答案附加数据 index:空索引 |
setSpanChecked(index: Int) | 设置当前选中的空,只改变样式,不显示编辑框,不弹出软键盘 index:空索引 |
setBlankBackgroundOffset(offset: Int) setBlankBackgroundOffset(horizontal: Int, vertical: Int) setBlankBackgroundOffset(left: Int, top: Int, right: Int, bottom: Int) |
设置空背景偏移, 向外为正,向内为负 |
- 在Project的 build.gradle 里面添加远程仓库
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- 在Module的 build.gradle 里面添加引入依赖项
implementation 'com.github.Vinx911:FillBlankTextView:1.0.1'
布局示例
<com.github.vinx911.FillBlankTextView
android:id="@+id/tv_fill_blank"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lineSpacingExtra="10dp"
android:text="天长地久。天地所以能长且久者,__________,__________。是以圣人后其身而身先,__________。非以其无私耶?故能成其私。"
android:textSize="16sp" />
代码示例
fillBlankTextView = findViewById(R.id.tv_fill_blank)
fillBlankTextView.apply {
this.text = """
|天长地久。天地所以能长且久者,__________,__________。
|是以圣人后其身而身先,__________。
|非以其无私耶?故能成其私。
""".trimMargin()
this.setAnswer(1, "故能长生")
this.blankTextColor = Color.parseColor("#1d953f")
this.blankTextSelectColor = Color.parseColor("#007947")
this.blankUnderlineColor = Color.parseColor("#8552a1")
this.blankUnderlineSelectColor = Color.parseColor("#f173ac")
this.blankUnderlineWidth = 5f
this.blankEllipsize = TextUtils.TruncateAt.START
// this.blankBackground = getDrawable(R.drawable.bg_blank)
// this.setBlankBackgroundOffset(0, 10)
}
点击外部取消焦点并隐藏软键盘
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
//如果是点击事件,获取点击的view,并判断是否要收起键盘
if (ev.action == MotionEvent.ACTION_DOWN) {
//获取目前得到焦点的view
val view = currentFocus
if (view != null && isShouldHideKeyboard(view, ev)) {
fillBlankTextView.setSpanChecked(-1)
}
}
return super.dispatchTouchEvent(ev)
}
//判断是否要收起键盘
private fun isShouldHideKeyboard(view: View, event: MotionEvent): Boolean {
//如果目前得到焦点的这个view是editText的话进行判断点击的位置
if (view === fillBlankTextView.editText) {
val location = intArrayOf(0, 0)
view.getLocationInWindow(location)
val left = location[0]
val top = location[1]
val bottom = top + view.getHeight()
val right = left + view.getWidth()
// 点击EditText的事件,忽略它。
return (event.x <= left || event.x >= right
|| event.y <= top || event.y >= bottom)
}
return false
}
需使用JDK8+编译,在你项目中的build.gradle的android{}中添加配置:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
更多使用详情,请查看app中的源码使用示例
无需混淆规则
- 移除属性名下划线
- 添加Readme
- 修改默认颜色为黑色
- 修改默认下划线宽