大家都知道,前几年在TextView文本前添加自定义标签文本或标签图片还是比较火的,特别是一些电商项目。不过这几年,UI设计基本很少见到这种设计了,不过还是有些时候,还是会遇到一些在文本前加标签需求。如果使用TextView
自带的drawableLeft
属性,虽然可以满足一些常规需求,但是可定制化太低,而且文本换行时图片和文本会分离,达不到想要的效果。当然,我这里也只是提供了一种方法,实现一个需求是有千千万万种方法的!
废话不多说,按照惯例,来一波图:
有的朋友肯定会说这很简单啊,对的,的确很简单。其实我就是把常用的一些方法写到一起,供大家调用,而且不用修改原来的代码就可以设置标签,当然还有一些其他方法(比如:下划线,删除线,格式文本颜色,超链等等),只需要调用对应方法就可以了,节约大波时间。
Step 1.先在 build.gradle(Project:XXX) 的 repositories 添加:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
Step 2. 然后在 build.gradle(Module:XXX) 的 dependencies 添加:
dependencies {
implementation 'com.github.ChinaLike:TagTextView:0.0.8'
}
Step 3. 在XML中引用即可(其中一种方式举例):
<com.view.text.TagTextView
android:id="@+id/tagTextView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="10dp"
android:text="荣耀V40轻奢版 5G 超级快充 6400万超清四摄 8GB+128GB钛空银 支持移动联通电信"
android:textColor="#666666"
app:tvt_tag_background_color="#FF6464"
app:tvt_tag_bottom_padding="1dp"
app:tvt_tag_left_padding="20dp"
app:tvt_tag_right_padding="20dp"
app:tvt_tag_text="新品"
app:tvt_tag_space="10dp"
app:tvt_tag_top_padding="1dp"
app:tvt_text_space="5dp" />
xml属性
API | 类型 | 默认值 | 描述 | 版本说明 | 说明 |
---|---|---|---|---|---|
tvt_left_top_radius | dimension | 标签左上圆角 | |||
tvt_left_bottom_radius | dimension | 标签左下圆角 | |||
tvt_right_top_radius | dimension | 标签右上圆角 | |||
tvt_right_bottom_radius | dimension | 标签右下圆角 | |||
tvt_radius | dimension | 9999dp | 标签圆角 | 当单独设置了标签圆角此方法对应方位圆角将失效 | |
tvt_tag_left_padding | dimension | 10dp | 标签左边内边距 | ||
tvt_tag_top_padding | dimension | 标签顶部内边距 | |||
tvt_tag_right_padding | dimension | 10dp | 标签右边内边距 | ||
tvt_tag_bottom_padding | dimension | 标签底部内边距 | |||
tvt_tag_padding | dimension | 0 | 标签内边距 | 当单独设置了标签内边距此方法对应方位内边距将失效 | |
tvt_tag_background_color | color | Color.GRAY | 标签背景颜色 | ||
tvt_tag_space | dimension | 0 | 标签与标签的间隔 | ||
tvt_text_space | dimension | 0 | 标签与文本的间隔 | ||
tvt_tag_location | enum | start | 标签显示的位置 | start开始位置,end结束位置 | |
tvt_tag_start_background_color | color | 渐变背景开始颜色 | |||
tvt_tag_end_background_color | color | 渐变背景结束颜色 | |||
tvt_tag_text_size | dimension | 14sp | 标签文本大小 | ||
tvt_tag_text_color | color | Color.WHITE | 标签文本颜色 | ||
tvt_first_tag_left_space | dimension | 0 | 第一个标签距离左边距离 | ||
tvt_tag_text | string | 标签内容 | 如果tvt_tag_text | ||
、tvt_tag_image都设置的话,只有tvt_tag_image生效 | |||||
tvt_tag_image | reference | 图片标签 | 如果tvt_tag_text | ||
、tvt_tag_image都设置的话,只有tvt_tag_image生效 | |||||
tvt_tag_width | dimension | 标签的自定义宽度 | |||
tvt_tag_height | dimension | 标签的自定义高度 |
属性
API | 类型 | 默认值 | 描述 | 版本说明 | 说明 |
---|---|---|---|---|---|
leftTopRadius | Float | 标签左上圆角 | |||
leftBottomRadius | Float | 标签左下圆角 | |||
rightTopRadius | Float | 标签右上圆角 | |||
rightBottomRadius | Float | 标签右下圆角 | |||
radius | Float | 9999F | 标签圆角 | 当单独设置了标签圆角此方法对应方位圆角将失效 | |
tagLeftPadding | Int | 10dp | 标签左边内边距 | ||
tagTopPadding | Int | 标签顶部内边距 | |||
tagRightPadding | Int | 10dp | 标签右边内边距 | ||
tagBottomPadding | Int | 标签底部内边距 | |||
tagPadding | Int | 0 | 标签内边距 | 当单独设置了标签内边距此方法对应方位内边距将失效 | |
tagBackgroundColor | Int | Color.GRAY | 标签背景颜色 | ||
tagSpace | Int | 0 | 标签与标签的间隔 | ||
textSpace | Int | 0 | 标签与文本的间隔 | ||
tagLocation | Int | TagLocation.START | 标签显示的位置 | ||
TagLocation.START开始位置,TagLocation.END结束位置 | |||||
tagStartBackgroundColor | Int | 渐变背景开始颜色 | |||
tagEndBackgroundColor | Int | 渐变背景结束颜色 | |||
tagTextSize | Float | 14sp | 标签文本大小 | ||
tagTextColor | Int | Color.WHITE | 标签文本颜色 | ||
firstTagLeftSpace | Int | 0 | 第一个标签距离左边距离 | ||
tagText | String | 标签内容 | 如果tagText 、tagImage都设置的话,只有tagImage生效 | ||
tagImage | Drawable | 图片标签 | 如果tagText | ||
、tagImage都设置的话,只有tagImage生效 | |||||
tagWidth | Int | 标签的自定义宽度 | |||
tagHeight | Int | 标签的自定义高度 |
方法
设置标签
params:标签内容,支持以下格式
BaseTagAdapter<*>:自定义适配器,自己实现标签显示样式,自定义中只有tvt_tag_space、tvt_text_space、tvt_tag_location、tvt_first_tag_left_space字段有效
MutableList<T>:多个标签,T支持String、DrawableRes、Bitmap、Drawable
String:字符串标签,如果是一个只需要传入一个字符串,多个就传入多个字符串
Bitmap:图片标签,如果是一个只需要传入一个Bitmap,多个就传入多个Bitmap
Int:图片标签,如果是一个只需要传入一个DrawableRes,多个就传入多个DrawableRes
Drawable:图片标签,如果是一个只需要传入一个Drawable,多个就传入多个Drawable
设置标签
config: 标签样式,可选,参考TagConfig
params:标签内容,支持以下格式:
BaseTagAdapter<*>:自定义适配器,自己实现标签显示样式MutableList<T>:多个标签,T支持String、DrawableRes、Bitmap、Drawable
String:字符串标签,如果是一个只需要传入一个字符串,多个就传入多个字符串
Bitmap:图片标签,如果是一个只需要传入一个Bitmap,多个就传入多个Bitmap
Int:图片标签,如果是一个只需要传入一个DrawableRes,多个就传入多个DrawableRes
Drawable:图片标签,如果是一个只需要传入一个Drawable,多个就传入多个Drawable
设置文本下划线
underline:需要加下划线的文本,如果多个一样,只有第一个加下划线
设置文本下划线
startIndex:开始下标
endIndex:结束下标
设置文本下划线
indexRang:整型数组,大小为2,可传多组
设置文本下划线
所有文本都设置下划线
设置文本删除线
underline:需要加删除线的文本,如果多个一样,只有第一个加删除线
设置文本删除线
startIndex:开始下标
endIndex:结束下标
设置文本删除线
indexRang:整型数组,大小为2,可传多组
设置文本删除线
所有文本都设置删除线
设置指定文字颜色
color:制定文本颜色
specificText:指定文本
isUnderlineText:是否显示下划线,可选,默认值false
onTagClickListener:点击事件响应,可选,-1文本被点击,其他是对应下标被点击
设置指定文字颜色
color:制定文本颜色
startIndex:开始下标
endIndex:结束下标
isUnderlineText:是否显示下划线,可选,默认值false
onTagClickListener:点击事件响应,可选,-1文本被点击,其他是对应下标被点击
设置指定文字颜色
data:自定义多个指定文本的颜色
onTagClickListener:点击事件响应,可选,-1文本被点击,其他是对应下标被点击
设置超链
startIndex:开始下标
endIndex:结束下标
type:超链接类型,参考SpanType
linkText:链接文本 ,比如跳转电话,只需要传入电话号码就可以
color:超链文本的颜色
isUnderlineText:是否显示下划线,可选,默认值false
设置超链
data:自定义超链,参考URLSpanConfig
普通标签
多个标签
<com.view.text.TagTextView
android:id="@+id/tagTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="10dp"
android:text="荣耀V40轻奢版 5G 超级快充 6400万超清四摄 8GB+128GB钛空银 移动联通电信5G 双卡双待手机"
android:textColor="#666666"
app:tvt_tag_background_color="#FF6464"
app:tvt_tag_bottom_padding="1dp"
app:tvt_tag_left_padding="20dp"
app:tvt_tag_right_padding="20dp"
app:tvt_tag_space="10dp"
app:tvt_tag_top_padding="1dp"
app:tvt_text_space="5dp" />
TagTextView tagTextView = findViewById(R.id.tagTextView);
tagTextView.setTextTag("新品", "黄金", "心悦");
或(Kotlin实现)
tagTextView.setTextTag("新品", "黄金", "心悦")
渐变背景
<com.view.text.TagTextView
android:id="@+id/tagTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="荣耀V40轻奢版 5G 超级快充 6400万超清四摄 8GB+128GB钛空银 移动联通电信5G 双卡双待手机"
android:textColor="#666666"
app:tvt_tag_end_background_color="@color/tagEndBackgroundColor"
app:tvt_tag_start_background_color="@color/tagStartBackgroundColor"/>
TagTextView tagTextView = findViewById(R.id.tagTextView);
tagTextView.setTextTag("优选", "新上市", "推荐");
或(Kotlin实现)
tagTextView.setTextTag("优选", "新上市", "推荐")
普通图片标签
多个图片标签
<com.view.text.TagTextView
android:id="@+id/tagTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="荣耀V40轻奢版 5G 超级快充 6400万超清四摄 8GB+128GB钛空银 移动联通电信5G 双卡双待手机"
android:textColor="#666666"
app:tvt_tag_space="10dp"/>
TagTextView tagTextView = findViewById(R.id.tagTextView);
tagTextView.setTextTag(R.mipmap.icon_hot, R.mipmap.icon_new2, R.mipmap.icon_new3);
或(Kotlin实现)
tagTextView.setTextTag(R.mipmap.icon_hot, R.mipmap.icon_new2, R.mipmap.icon_new3);
自定义标签
<com.view.text.TagTextView
android:id="@+id/tagTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="荣耀V40轻奢版 5G 超级快充 6400万超清四摄 8GB+128GB钛空银 移动联通电信5G 双卡双待手机"
android:textColor="#666666"
app:tvt_text_space="10dp"
app:tvt_tag_space="5dp"/>
List<String> data = new ArrayList();
data.add("");
data.add("圆角标签");
data.add("有边框标签");
data.add("渐变标签");
data.add("自定义圆角");
TagTextView tagTextView = findViewById(R.id.tagTextView);
tagTextView.setTextTag(new BaseTagAdapter<String>(this,data) {
@NotNull
@Override
public View convert(int i) {
View view = new View(MainActivity.this);
if (i == 0){
view = new AppCompatImageView(MainActivity.this);
((AppCompatImageView) view).setImageResource(R.mipmap.notice);
}else if (i == 1){
view = LayoutInflater.from(MainActivity.this).inflate(R.layout.adapter_custom_tag,null);
view.findViewById(R.id.rootView).setBackgroundResource(R.drawable.radius_fill_bg);
AppCompatTextView textView = view.findViewById(R.id.tagText);
textView.setText(data.get(i));
textView.setTextColor(Color.RED);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,DensityUtil.INSTANCE.sp2px(MainActivity.this,10F));
}else if (i == 2){
view = LayoutInflater.from(MainActivity.this).inflate(R.layout.adapter_custom_tag,null);
AppCompatTextView textView = view.findViewById(R.id.tagText);
textView.setText(data.get(i));
}else if (i == 3){
view = LayoutInflater.from(MainActivity.this).inflate(R.layout.adapter_custom_tag,null);
view.findViewById(R.id.rootView).setBackgroundResource(R.drawable.gra_bg);
AppCompatTextView textView = view.findViewById(R.id.tagText);
textView.setText(data.get(i));
}else if (i == 4){
view = LayoutInflater.from(MainActivity.this).inflate(R.layout.adapter_custom_tag,null);
view.findViewById(R.id.rootView).setBackgroundResource(R.drawable.custom_radius);
AppCompatTextView textView = view.findViewById(R.id.tagText);
textView.setText(data.get(i));
}
return view;
}
});
或(Kotlin实现)
val data: MutableList<String> = mutableListOf("", "圆角标签", "有边框标签", "渐变标签", "自定义圆角")
findViewById<TagTextView>(R.id.tagTextView).setTextTag(
object : BaseTagAdapter<String>(this@MainActivity3, data) {
override fun convert(position: Int): View {
var view: View = View(context)
when (position) {
0 -> {
view = AppCompatImageView(context).apply {
setImageResource(R.mipmap.notice)
}
}
1 -> {
view = LayoutInflater.from(context).inflate( R.layout.adapter_custom_tag, null )
view.findViewById<LinearLayout>(R.id.rootView).setBackgroundResource(R.drawable.radius_fill_bg)
view.findViewById<AppCompatTextView>(R.id.tagText).apply {
text = "${data[position]}"
setTextColor(Color.RED)
setTextSize( TypedValue.COMPLEX_UNIT_PX, DensityUtil.sp2px(this@MainActivity3, 10F))
}
}
2 -> {
view = LayoutInflater.from(context).inflate( R.layout.adapter_custom_tag, null)
view.findViewById<AppCompatTextView>(R.id.tagText).text = "${data[position]}"
}
3 -> {
view = LayoutInflater.from(context).inflate(R.layout.adapter_custom_tag,null)
view.findViewById<LinearLayout>(R.id.rootView).setBackgroundResource(R.drawable.gra_bg)
view.findViewById<AppCompatTextView>(R.id.tagText).text = "${data[position]}"
}
4 -> {
view = LayoutInflater.from(context).inflate(R.layout.adapter_custom_tag,null)
view.findViewById<LinearLayout>(R.id.rootView).setBackgroundResource(R.drawable.custom_radius)
view.findViewById<AppCompatTextView>(R.id.tagText).text = "${data[position]}"
}
}
return view
}
}
)
涉及到的示例文件如果没有,可以滑动到底部查看源码,在demo可以找到
下划线
删除线
格式化字符串
超链
如有问题欢迎留言 源码地址
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。