扩展TabLayout 实现Item 之间设置间距,当Item 可以展示下的时候 ItemCount/ScreenWidth 当展示不下的时候则按照固定间距展示
/**
* @date : 2024/12/10
* @author spc
* @Description: 自定义 TabLayout 可以设置间距
*/
class CustomSpaceTabLayout @JvmOverloads constructor(
context: Context, attributeSet: AttributeSet? = null, defAttributeSet: Int = 0
) : TabLayout(context, attributeSet, defAttributeSet) {
private var tabSpacing = ConvertUtils.dp2px(20f)
private var totalTabWidths = 0f
private var tabCount = 0
private var totalWidth = ScreenUtils.getScreenWidth().toFloat()
private var totalMinWidth = 0f
init {
val typedArray =
context.obtainStyledAttributes(attributeSet, R.styleable.CustomSpaceTabLayout)
tabSpacing = typedArray.getDimensionPixelSize(
R.styleable.CustomSpaceTabLayout_tabSpace,
ConvertUtils.dp2px(20f)
)
typedArray.recycle()
}
fun setTabData(list: MutableList<HomeCatBean>?) {
tabCount = CollectionUtils.size(list)
if (CollectionUtils.isNotEmpty(list)) {
totalTabWidths = 0f
list!!.forEach {
totalTabWidths += measureTextWidth(it.homeCatName)
}
}
val totalSpacing = tabSpacing * (tabCount + 1)
totalMinWidth = totalTabWidths + totalSpacing
val availableWidth = totalWidth - totalSpacing
if (totalMinWidth < totalWidth) {
// 如果总最小宽度小于等于可用宽度,平均分配剩余空间
val extraWidthPerTab: Int =
((availableWidth - totalTabWidths) / (tabCount + 1)).toInt()
tabSpacing += extraWidthPerTab
}
}
override fun addTab(tab: Tab, position: Int) {
super.addTab(tab)
if (position < tabCount && tabCount > 0) {
val view = tab.view
view.setPadding(tabSpacing / 2, 0, tabSpacing / 2, 0)
if (totalMinWidth > totalWidth && view.layoutParams != null && (position == 0 || position == tabCount - 1)) {
val marginLayoutParams = view.layoutParams as MarginLayoutParams
if (position == 0) {
if (LanguageManager.getInstance().isLanguageNeedRTL) {
marginLayoutParams.rightMargin = tabSpacing / 2
} else {
marginLayoutParams.leftMargin = tabSpacing / 2
}
} else if (position == tabCount - 1) {
if (LanguageManager.getInstance().isLanguageNeedRTL) {
marginLayoutParams.leftMargin = tabSpacing / 2
} else {
marginLayoutParams.rightMargin = tabSpacing / 2
}
}
}
}
}
private fun measureTextWidth(content: String?): Float {
val textView = TextView(context).apply {
setTextSize(TypedValue.COMPLEX_UNIT_SP, 13f)
maxLines = 1
ellipsize = TextUtils.TruncateAt.END
isAllCaps = false
gravity = Gravity.CENTER
paint.setTypeface(Typeface.DEFAULT_BOLD)
}
content?.let {
return textView.paint.measureText(it)
}
return 0f
}
}