From 14c9cfa4a748ffa4f9cd5c108d3360bd679adb06 Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Tue, 4 Nov 2025 19:35:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=86=E5=8F=B2tab=20=E5=88=9D=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/setting/customui/ChatSettingView.kt | 3 +- .../ui/main/history/HistoryFragment.kt | 24 +- .../history/customui/RoundAnimTabLayout.kt | 239 ++++++++++++++++++ .../ui/main/history/customui/beans/TabItem.kt | 26 ++ .../src/main/res/layout/item_smooth_tab.xml | 26 ++ .../res/mipmap-xxhdpi/history_tab_bg.webp | Bin 0 -> 27094 bytes .../res/mipmap-xxhdpi/history_tab_books.webp | Bin 0 -> 930 bytes .../res/mipmap-xxhdpi/history_tab_comics.webp | Bin 0 -> 1358 bytes .../res/mipmap-xxhdpi/history_tab_manga.webp | Bin 0 -> 1128 bytes 9 files changed, 315 insertions(+), 3 deletions(-) create mode 100644 VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/RoundAnimTabLayout.kt create mode 100644 VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/beans/TabItem.kt create mode 100644 VisualNovel/app/src/main/res/layout/item_smooth_tab.xml create mode 100644 VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_bg.webp create mode 100644 VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_books.webp create mode 100644 VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_comics.webp create mode 100644 VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_manga.webp diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/setting/customui/ChatSettingView.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/setting/customui/ChatSettingView.kt index e5c7b25..4453d83 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/setting/customui/ChatSettingView.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/chat/setting/customui/ChatSettingView.kt @@ -27,8 +27,7 @@ import java.util.Date class ChatSettingView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, - defStyleAttr: Int = 0 -) : android.widget.LinearLayout(context, attrs, defStyleAttr) { + defStyleAttr: Int = 0) : LinearLayout(context, attrs, defStyleAttr) { private var mBinding = LayoutChatMenuViewBinding.inflate(LayoutInflater.from(context), this, true) diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt index f4bb89b..b555def 100644 --- a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/HistoryFragment.kt @@ -5,9 +5,10 @@ import androidx.fragment.app.viewModels import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter import com.dylanc.loadingstateview.BgColorType -import com.gyf.immersionbar.ImmersionBar +import com.remax.visualnovel.R import com.remax.visualnovel.app.base.BaseBindingFragment import com.remax.visualnovel.databinding.FragmentMainHistoryBinding +import com.remax.visualnovel.ui.main.history.customui.beans.TabItem import com.remax.visualnovel.utils.Routers import com.remax.visualnovel.utils.StatusBarUtil3 import dagger.hilt.android.AndroidEntryPoint @@ -33,6 +34,27 @@ class HistoryFragment : BaseBindingFragment() { with (binding.toolbar) { setPadding(paddingLeft, paddingTop + StatusBarUtil3.getStatusBarHeight(context), paddingRight, paddingBottom) } + + initTabLayout() + } + + private fun initTabLayout() { + with (binding.tabLayout) { + val tabItems = listOf( + TabItem("Manga", R.mipmap.history_tab_manga), + TabItem("Motion Comics", R.mipmap.history_tab_comics), + TabItem("Character", R.mipmap.history_tab_books) + ) + setTabItems(tabItems) + setOnTabSelectedListener { position -> + switchFragment(position) + } + setSelectedTab(0) + } + } + + private fun switchFragment(fragmentIndex: Int) { + } companion object { diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/RoundAnimTabLayout.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/RoundAnimTabLayout.kt new file mode 100644 index 0000000..175a263 --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/RoundAnimTabLayout.kt @@ -0,0 +1,239 @@ +package com.remax.visualnovel.ui.main.history.customui + +import android.animation.AnimatorSet +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.graphics.drawable.GradientDrawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import com.remax.visualnovel.R +import com.remax.visualnovel.ui.main.history.customui.beans.TabConfig +import com.remax.visualnovel.ui.main.history.customui.beans.TabItem + +class RoundAnimTabLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + + private var tabConfig = TabConfig() + private val tabItems = mutableListOf() + private var selectedTabPosition = 0 + private var onTabSelectedListener: ((Int) -> Unit)? = null + + // 选中的Tab背景(渐变) + private val selectedTabGradient = GradientDrawable().apply { + shape = GradientDrawable.RECTANGLE + cornerRadius = tabConfig.cornerRadius + colors = intArrayOf( + 0xFF6366F1.toInt(), // 紫色 + 0xFF3B82F6.toInt() // 蓝色 + ) + orientation = GradientDrawable.Orientation.LEFT_RIGHT + } + + init { + orientation = HORIZONTAL + setWillNotDraw(false) + initAttributes(attrs) + setupLayout() + } + + private fun initAttributes(attrs: AttributeSet?) { + attrs?.let { + val typedArray = context.obtainStyledAttributes(it, R.styleable.CustomTabLayout) + + tabConfig = tabConfig.copy( + normalTextColor = typedArray.getColor( + R.styleable.CustomTabLayout_textColorNormal, Color.GRAY + ), + selectedTextColor = typedArray.getColor( + R.styleable.CustomTabLayout_textColorSelected, Color.WHITE + ), + textSize = typedArray.getDimension( + R.styleable.CustomTabLayout_textSize, 14f + ), + iconSize = typedArray.getDimensionPixelSize( + R.styleable.CustomTabLayout_iconSize, 20 + ), + cornerRadius = typedArray.getDimension( + R.styleable.CustomTabLayout_tabCornerRadius, 20f + ), + animationDuration = typedArray.getInt( + R.styleable.CustomTabLayout_animDuration, 300 + ).toLong(), + tabSpacing = typedArray.getDimensionPixelSize( + R.styleable.CustomTabLayout_tabSpacing, 8 + ) + ) + + typedArray.recycle() + } + + // 更新渐变背景的圆角 + selectedTabGradient.cornerRadius = tabConfig.cornerRadius + } + + private fun setupLayout() { + background = createNormalBackground() + setPadding(tabConfig.tabSpacing, tabConfig.tabSpacing, + tabConfig.tabSpacing, tabConfig.tabSpacing) + } + + private fun createNormalBackground(): Drawable { + return GradientDrawable().apply { + shape = GradientDrawable.RECTANGLE + cornerRadius = tabConfig.cornerRadius + setColor(Color.WHITE) + setStroke(1, Color.LTGRAY) + } + } + + fun setTabItems(items: List) { + tabItems.clear() + tabItems.addAll(items) + removeAllViews() + createTabViews() + } + + private fun createTabViews() { + tabItems.forEachIndexed { index, tabItem -> + val tabView = createTabView(tabItem, index) + addView(tabView) + + // 设置权重,使tab均匀分布 + val params = LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f) + params.marginEnd = if (index < tabItems.size - 1) tabConfig.tabSpacing else 0 + tabView.layoutParams = params + } + + // 设置初始选中状态 + setSelectedTab(selectedTabPosition, animate = false) + } + + private fun createTabView(tabItem: TabItem, position: Int): View { + return LayoutInflater.from(context).inflate(R.layout.item_smooth_tab, this, false).apply { + val iconView = findViewById(R.id.ivTabIcon) + val textView = findViewById(R.id.tvTabText) + + // 设置图标和文字 + iconView.setImageResource(tabItem.iconRes) + textView.text = tabItem.text + textView.setTextColor(tabConfig.normalTextColor) + textView.textSize = tabConfig.textSize / resources.displayMetrics.density + + // 设置图标大小 + iconView.layoutParams = iconView.layoutParams.apply { + width = tabConfig.iconSize + height = tabConfig.iconSize + } + + // 设置点击事件 + setOnClickListener { + setSelectedTab(position) + onTabSelectedListener?.invoke(position) + } + + // 设置标签以便后续查找 + tag = position + } + } + + fun setSelectedTab(position: Int, animate: Boolean = true) { + if (position !in 0 until tabItems.size) return + + val previousPosition = selectedTabPosition + selectedTabPosition = position + + // 更新所有tab的状态 + updateTabAppearance(previousPosition, position, animate) + } + + private fun updateTabAppearance(previousPos: Int, newPos: Int, animate: Boolean) { + // 更新之前的选中tab + getTabViewAt(previousPos)?.let { previousView -> + updateTabViewAppearance(previousView, previousPos, isSelected = false, animate) + } + + // 更新新的选中tab + getTabViewAt(newPos)?.let { newView -> + updateTabViewAppearance(newView, newPos, isSelected = true, animate) + } + } + + private fun getTabViewAt(position: Int): View? { + return findViewWithTag(position) + } + + private fun updateTabViewAppearance(tabView: View, position: Int, + isSelected: Boolean, animate: Boolean) { + val iconView = tabView.findViewById(R.id.ivTabIcon) + val textView = tabView.findViewById(R.id.tvTabText) + + tabItems[position].isSelected = isSelected + + val targetBackground = if (isSelected) selectedTabGradient else null + val targetTextColor = if (isSelected) tabConfig.selectedTextColor else tabConfig.normalTextColor + val targetAlpha = if (isSelected) 1.0f else 0.6f + + if (animate) { + // 背景颜色动画 + val backgroundAnim = ValueAnimator.ofInt(0, 255).apply { + duration = tabConfig.animationDuration + addUpdateListener { animator -> + val alpha = animator.animatedValue as Int + if (isSelected) { + selectedTabGradient.alpha = alpha + tabView.background = selectedTabGradient + } else { + tabView.background = null + } + } + } + + // 文字颜色动画 + val textColorAnim = ValueAnimator.ofArgb( + textView.currentTextColor, targetTextColor + ).apply { + duration = tabConfig.animationDuration + addUpdateListener { animator -> + textView.setTextColor(animator.animatedValue as Int) + } + } + + // 透明度动画 + val alphaAnim = ValueAnimator.ofFloat(iconView.alpha, targetAlpha).apply { + duration = tabConfig.animationDuration + addUpdateListener { animator -> + val alpha = animator.animatedValue as Float + iconView.alpha = alpha + } + } + + // 同时执行所有动画 + AnimatorSet().apply { + playTogether(backgroundAnim, textColorAnim, alphaAnim) + start() + } + } else { + // 无动画直接设置 + tabView.background = targetBackground + textView.setTextColor(targetTextColor) + iconView.alpha = targetAlpha + } + } + + fun setOnTabSelectedListener(listener: (Int) -> Unit) { + this.onTabSelectedListener = listener + } + + fun getSelectedTabPosition(): Int = selectedTabPosition + + fun getTabCount(): Int = tabItems.size +} \ No newline at end of file diff --git a/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/beans/TabItem.kt b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/beans/TabItem.kt new file mode 100644 index 0000000..cf6307b --- /dev/null +++ b/VisualNovel/app/src/main/java/com/remax/visualnovel/ui/main/history/customui/beans/TabItem.kt @@ -0,0 +1,26 @@ +package com.remax.visualnovel.ui.main.history.customui.beans + +import android.graphics.Color +import androidx.annotation.DrawableRes +import com.remax.visualnovel.R +import com.remax.visualnovel.utils.ResUtil +import com.remax.visualnovel.utils.ResUtil.dpToPx + + +data class TabItem( + val text: String, + @DrawableRes val iconRes: Int = 0, + var isSelected: Boolean = false +) + +data class TabConfig( + val normalTextColor: Int = ResUtil.getColor(R.color.gray6), + val selectedTextColor: Int = Color.WHITE, + val textSize: Float = 14f, + val iconSize: Int = 20.dpToPx, + val cornerRadius: Float = 20f.dpToPx.toFloat(), + val animationDuration: Long = 300, + val tabSpacing: Int = 8.dpToPx, + val tabPadding: Int = 16.dpToPx, + val selectedBackground: Int = Color.BLUE +) diff --git a/VisualNovel/app/src/main/res/layout/item_smooth_tab.xml b/VisualNovel/app/src/main/res/layout/item_smooth_tab.xml new file mode 100644 index 0000000..6634e7d --- /dev/null +++ b/VisualNovel/app/src/main/res/layout/item_smooth_tab.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_bg.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..a34ab29e97dda31495132a95783b9ff0fb6c6c87 GIT binary patch literal 27094 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 literal 0 HcmV?d00001 diff --git a/VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_manga.webp b/VisualNovel/app/src/main/res/mipmap-xxhdpi/history_tab_manga.webp new file mode 100644 index 0000000000000000000000000000000000000000..f637012c2d07ed442d1c24cd84963da9ba3d720f GIT binary patch literal 1128 zcmWIYbaP8!VPFV%bqWXzu!!JdU|=u+VpA~kbaoCn!3g9sFrEOBEI_H;ypp0IcPE92 z$S4K&2Mmlr2nLDC#RU)+RuZV{+ck*V%eq)q;1}dfNi9wWD)|7!Dn&rcfo>83vPIG% zYz+`Q3BtAkvCB&eN`PttK=2?(*InG6iuTNxN6ZXv`}7BDdI zw=ghlJC6`Ugh@eSQ6ktlU~DijrKK@2d|J-Hz#GZHAbf#=fh!s;2PAN~O#vt+19VqD z5T-NaFr+dlFnBWLF(fnS0a-@CNHt_I1IDmVArk|GzNrJRfcznaNh<2b-X;z8j2ve+ zm`S)ydXkdX$@W2?p;2<0ql%|r+O!OY|4afi5+%3gN?YdK^t^R%`vKMk+uroA^o|B-ca<8@Z%vWV5o9d>icwV}{c60BxN%0Srled3fOsd~&^7-8>-IL1~esg#>`}gXp59O@42m5J1KYO>PT4r{+=RMPF z`=&2e`5yf?QD%?Y%(ae7kE)#i{Wfq)TJ39t4U+LcRWGz&eO&xm*!ipB_lKWeoxYV( zx~JZ==y&BpGr4HaitVYl)n?|8ZevhsmwSuU^OviR0(! zXSUL8u1XP*|FzRZpzN(5U&Bf9>ZvpTd{wR7{c~GDZA;yrU4M31MaA=~J$rtvI=uOQ z@cM7F)wV?>&&`dx