选中UI刷新和抽象

This commit is contained in:
renhaoting 2025-10-21 15:44:34 +08:00
parent 2426f6b8bd
commit cdc13082de
6 changed files with 47 additions and 21 deletions

View File

@ -10,7 +10,7 @@ import com.dylanc.loadingstateview.BgColorType
import com.remax.visualnovel.app.base.BaseBindingFragment
import com.remax.visualnovel.databinding.FragmentMainActorBinding
import com.remax.visualnovel.utils.Routers
import com.remax.visualnovel.widget.custom.TagItem
import com.remax.visualnovel.widget.custom.AbsTagBean
import dagger.hilt.android.AndroidEntryPoint
import kotlin.getValue
@ -42,22 +42,22 @@ class ActorListFragment : BaseBindingFragment<FragmentMainActorBinding>() {
with(binding) {
// 模拟数据
val tags = listOf(
TagItem("1", "Youth"),
TagItem("2", "Lolita"),
TagItem("2", "Lolita2"),
TagItem("3", "Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"),
TagItem("3", "ggggggggggg CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"),
TagItem("4", "Uncle"),
TagItem("5", "Character Status"),
TagItem("6", "Imouto"),
TagItem("7", "Fanwork"),
TagItem("8", "LastLine"),
ActorTagBean("1", "Youth"),
ActorTagBean("2", "Lolita"),
ActorTagBean("2", "Lolita2"),
ActorTagBean("3", "Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"),
ActorTagBean("3", "ggggggggggg CEO ABCDEFG Overbearing CEO ABCDEFG Overbearing CEO ABCDEFG"),
ActorTagBean("4", "Uncle"),
ActorTagBean("5", "Character Status"),
ActorTagBean("6", "Imouto"),
ActorTagBean("7", "Fanwork"),
ActorTagBean("8", "LastLine"),
)
tagFlowLayout.setTagDataList(tags)
tagFlowLayout.setOnTagClickListener { tag ->
Toast.makeText(context, "Clicked: ${tag.text}", Toast.LENGTH_SHORT).show()
Toast.makeText(context, "Clicked: ${tag.showStr}", Toast.LENGTH_SHORT).show()
}
tagFlowLayout.setOnExpandStateChangeListener { isExpanded ->

View File

@ -0,0 +1,7 @@
package com.remax.visualnovel.ui.main.actor
import com.remax.visualnovel.widget.custom.AbsTagBean
data class ActorTagBean(val tagId: String, override val showStr: String) : AbsTagBean(showStr) {
}

View File

@ -1,7 +1,6 @@
package com.remax.visualnovel.widget.custom
data class TagItem(
val id: String,
val text: String,
abstract class AbsTagBean(
open val showStr: String,
var isSelected: Boolean = false
)

View File

@ -17,6 +17,7 @@ import com.remax.visualnovel.extension.spToPx
import kotlin.math.max
import kotlin.math.min
import androidx.core.content.withStyledAttributes
import kotlin.collections.mutableListOf
class TagFlowLayout2 @JvmOverloads constructor(
context: Context,
@ -29,6 +30,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
private var verticalSpacing = 8f.dpToPx()
private var textSize = 12f.spToPx()
private var textColor = context.resources.getColor(R.color.tag_text_color)
private var textColorSelected = context.resources.getColor(R.color.white)
private var tagBackground: Drawable? = null
private var maxLinesWhileShrink = 1
private var eachLineMaxTagNum = 2
@ -43,12 +45,12 @@ class TagFlowLayout2 @JvmOverloads constructor(
private var eachLineAvailableWidth = 0
// 数据
private val tagItems = mutableListOf<TagItem>()
private val tagItems = mutableListOf<AbsTagBean>()
private val tagViews = mutableListOf<TextView>()
private lateinit var expandIcon: ImageView
// 监听器
private var onTagClickListener: ((TagItem) -> Unit)? = null
private var onTagClickListener: ((AbsTagBean) -> Unit)? = null
private var onExpandStateChangeListener: ((Boolean) -> Unit)? = null
init {
@ -113,7 +115,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
}
fun setTagDataList(tags: List<TagItem>) {
fun setTagDataList(tags: List<AbsTagBean>) {
tagItems.clear()
tagViews.forEach { removeView(it) }
tagViews.clear()
@ -128,9 +130,9 @@ class TagFlowLayout2 @JvmOverloads constructor(
requestLayout()
}
private fun createTagView(tag: TagItem): TextView {
private fun createTagView(tag: AbsTagBean): TextView {
return TextView(context).apply {
text = tag.text
text = tag.showStr
setTextColor(textColor)
textSize = textSize / resources.displayMetrics.scaledDensity
setPadding(10.dpToPx(), 7.dpToPx(), 10.dpToPx(), 7.dpToPx())
@ -142,6 +144,13 @@ class TagFlowLayout2 @JvmOverloads constructor(
setOnClickListener {
onTagClickListener?.invoke(tag)
with(tag) {
isSelected = !isSelected
}
setTextColor(if (tag.isSelected) textColorSelected else textColor)
setBackgroundResource(if (tag.isSelected) R.drawable.tag_flow_item_bg_selected else R.drawable.tag_flow_item_bg)
requestLayout()
}
}
}
@ -289,7 +298,7 @@ class TagFlowLayout2 @JvmOverloads constructor(
expandIcon.setImageDrawable(indicator)
}
fun setOnTagClickListener(listener: (TagItem) -> Unit) {
fun setOnTagClickListener(listener: (AbsTagBean) -> Unit) {
onTagClickListener = listener
}
@ -317,5 +326,9 @@ class TagFlowLayout2 @JvmOverloads constructor(
requestLayout()
}
fun getSelectedTagList() : List<AbsTagBean> {
return tagItems.filter { it.isSelected }
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="15dp" />
<solid android:color="@color/tag_bg_color_selected" />
</shape>

View File

@ -183,6 +183,7 @@
<!-- new added -->
<color name="tag_bg_color">#ffbac5d2</color>
<color name="tag_bg_color_selected">#ff0065ff</color>
<color name="tag_text_color">#ffe5f1ff</color>