Android TabLayout 实现设置Item 之间的间距

扩展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
    }

}