feat: 优化首页多Tab导航页渲染速度

This commit is contained in:
叶子维
2024-09-26 13:51:39 +08:00
parent 773c9da941
commit cdae5e4427
12 changed files with 724 additions and 772 deletions

View File

@ -5,6 +5,6 @@ import com.gh.gamecenter.entity.BottomTab
interface ISearchToolbarTab {
fun onScrollChanged(totalHeight: Int, offset: Int, isDarkModeChanged: Boolean)
fun changeAppBarColor(color: Int, pageId: String)
fun setSearchStyle(searchStyle: BottomTab.SearchStyle)
fun updateSearchStyle(searchStyle: BottomTab.SearchStyle)
fun getCurrentTabIndex(): Int?
}

View File

@ -286,7 +286,7 @@ class CustomPageFragment : LazyFragment(), ISmartRefreshContent, IScrollable {
if (requireArguments().getString(EntranceConsts.KEY_MULTI_TAB_NAV_ID, "")
.isEmpty() && it.topSearch.isNotEmpty()
) {
(parentFragment as? ISearchToolbarTab)?.setSearchStyle(BottomTab.SearchStyle(searchType = it.topSearch))
(parentFragment as? ISearchToolbarTab)?.updateSearchStyle(BottomTab.SearchStyle(searchType = it.topSearch))
}
}

View File

@ -4,10 +4,9 @@ import android.graphics.Typeface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewStub
import android.widget.LinearLayout
import androidx.core.graphics.ColorUtils
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
@ -20,8 +19,10 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.common.base.adapter.FragmentAdapter
import com.gh.gamecenter.common.base.fragment.BaseLazyFragment
import com.gh.gamecenter.common.base.fragment.ToolbarFragment
import com.gh.gamecenter.common.constant.Constants
import com.gh.gamecenter.common.constant.EntranceConsts
import com.gh.gamecenter.common.databinding.ReuseLoadingBinding
import com.gh.gamecenter.common.databinding.ReuseNoConnectionBinding
import com.gh.gamecenter.common.databinding.ReuseNoneDataBinding
import com.gh.gamecenter.common.exposure.ExposureSource
import com.gh.gamecenter.common.json.json
import com.gh.gamecenter.common.utils.*
@ -33,39 +34,40 @@ import com.gh.gamecenter.entity.MultiTabNav
import com.gh.gamecenter.fragment.ReloadFragment
import com.gh.gamecenter.home.custom.CustomPageFragment
import com.google.android.material.tabs.TabLayout
import com.halo.assistant.fragment.WebFragment
import java.util.*
import kotlin.math.abs
/**
* 多Tab导航页 基类
*/
abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
protected var mViewPager: ViewPager? = null
protected var mTabLayout: TabLayout? = null
protected var mIndicatorView: TabIndicatorView? = null
protected var mNoneDataContainer: ViewGroup? = null
protected var mNoConnectionContainer: ViewGroup? = null
protected var mLoadingContainer: ViewGroup? = null
protected var viewPager: ViewPager? = null
protected var tabLayout: TabLayout? = null
protected var indicatorView: TabIndicatorView? = null
protected var noDataStub: ViewStub? = null
protected var noConnectionStub: ViewStub? = null
protected var loadingStub: ViewStub? = null
protected var noConnectionBinding: ReuseNoConnectionBinding? = null
protected var noDataBinding: ReuseNoneDataBinding? = null
protected var loadingBinding: ReuseLoadingBinding? = null
protected var mTabBindingList = arrayListOf<TabItemMainBinding>()
protected var mTabImageStyleList = arrayListOf<Int>()
protected var tabBindingList = arrayListOf<TabItemMainBinding>()
protected var tabImageStyleList = arrayListOf<Int>()
protected var mFragmentList = ArrayList<Fragment>()
protected var fragmentList = ArrayList<Fragment>()
protected var mMultiTabNavId = ""
protected var mMultiTabNavName = ""
protected var mBottomTabId = ""
protected var mBottomTabName = ""
protected var mDefaultSelectedTab = -1
protected var mLastSelectedPosition = 0
protected var multiTabNavId = ""
protected var multiTabNavName = ""
protected var bottomTabId = ""
protected var bottomTabName = ""
protected var defaultSelectedTab = -1
protected var lastSelectedPosition = 0
protected var mBackgroundColor: Int = 0
protected var mBackgroundWhiteColor: Int = 0
protected var mAmwayPrimaryColor: Int = 0
protected var mTabDefaultColor: Int = 0
protected var mTabSelectedColor: Int = 0
protected var mTabDefaultLightColor: Int = 0
protected var backgroundColor: Int = 0
protected var backgroundWhiteColor: Int = 0
protected var amwayPrimaryColor: Int = 0
protected var tabDefaultColor: Int = 0
protected var tabSelectedColor: Int = 0
protected var tabDefaultLightColor: Int = 0
abstract fun provideViewModel(): TabWrapperViewModel
protected open fun provideTabLayout(): TabLayout? = mCachedView.findViewById(R.id.tabLayout)
@ -76,42 +78,42 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
protected open fun provideTabDefaultColor(): Int = TAB_DEFAULT_COLOR
protected open fun provideTabSelectedColor(): Int = TAB_SELECTED_COLOR
override fun provideMultiTabId(): String = mMultiTabNavId
override fun provideMultiTabName(): String = mMultiTabNavName
override fun provideMultiTabId(): String = multiTabNavId
override fun provideMultiTabName(): String = multiTabNavName
override fun provideCurrentTabEntity(): MultiTabNav.LinkMultiTabNav? = getCurrentTabEntity()
override fun provideLastSelectedPosition(): Int = mLastSelectedPosition
override fun provideLastSelectedPosition(): Int = lastSelectedPosition
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
savedInstanceState?.let { mDefaultSelectedTab = it.getInt(LAST_SELECTED_POSITION) }
mMultiTabNavId = arguments?.getString(EntranceConsts.KEY_MULTI_TAB_NAV_ID, "") ?: ""
mMultiTabNavName = arguments?.getString(EntranceConsts.KEY_MULTI_TAB_NAV_NAME, "") ?: ""
mBottomTabName = arguments?.getString(EntranceConsts.KEY_BOTTOM_TAB_NAME, "") ?: ""
mBottomTabId = arguments?.getString(EntranceConsts.KEY_BOTTOM_TAB_ID, "") ?: ""
savedInstanceState?.let { defaultSelectedTab = it.getInt(LAST_SELECTED_POSITION) }
multiTabNavId = arguments?.getString(EntranceConsts.KEY_MULTI_TAB_NAV_ID, "") ?: ""
multiTabNavName = arguments?.getString(EntranceConsts.KEY_MULTI_TAB_NAV_NAME, "") ?: ""
bottomTabName = arguments?.getString(EntranceConsts.KEY_BOTTOM_TAB_NAME, "") ?: ""
bottomTabId = arguments?.getString(EntranceConsts.KEY_BOTTOM_TAB_ID, "") ?: ""
}
override fun onSaveInstanceState(outState: Bundle) {
mViewPager?.let { outState.putInt(LAST_SELECTED_POSITION, it.currentItem) }
viewPager?.let { outState.putInt(LAST_SELECTED_POSITION, it.currentItem) }
super.onSaveInstanceState(outState)
}
override fun onFragmentFirstVisible() {
super.onFragmentFirstVisible()
mNoneDataContainer = mCachedView.findViewById(R.id.reuse_none_data)
mNoConnectionContainer = mCachedView.findViewById(R.id.reuse_no_connection)
mLoadingContainer = mCachedView.findViewById(R.id.reuse_ll_loading)
noDataStub = mCachedView.findViewById(R.id.reuse_no_data_stub)
noConnectionStub = mCachedView.findViewById(R.id.reuse_no_connection_stub)
loadingStub = mCachedView.findViewById(R.id.reuse_loading_stub)
mBackgroundColor = com.gh.gamecenter.common.R.color.ui_background.toColor(requireContext())
mBackgroundWhiteColor = com.gh.gamecenter.common.R.color.ui_surface.toColor(requireContext())
mAmwayPrimaryColor = com.gh.gamecenter.common.R.color.amway_primary_color.toColor(requireContext())
mTabDefaultColor = provideTabDefaultColor().toColor(requireContext())
mTabSelectedColor = provideTabSelectedColor().toColor(requireContext())
mTabDefaultLightColor = TAB_DEFAULT_COLOR_LIGHT.toColor(requireContext())
backgroundColor = com.gh.gamecenter.common.R.color.ui_background.toColor(requireContext())
backgroundWhiteColor = com.gh.gamecenter.common.R.color.ui_surface.toColor(requireContext())
amwayPrimaryColor = com.gh.gamecenter.common.R.color.amway_primary_color.toColor(requireContext())
tabDefaultColor = provideTabDefaultColor().toColor(requireContext())
tabSelectedColor = provideTabSelectedColor().toColor(requireContext())
tabDefaultLightColor = TAB_DEFAULT_COLOR_LIGHT.toColor(requireContext())
if (mMultiTabNavId.isNotEmpty()) {
if (multiTabNavId.isNotEmpty()) {
provideViewModel().tabListLiveData.observe(viewLifecycleOwner) {
if (mDefaultSelectedTab == -1) {
mDefaultSelectedTab = provideViewModel().defaultTabPosition
if (defaultSelectedTab == -1) {
defaultSelectedTab = provideViewModel().defaultTabPosition
}
initViewPager(ArrayList(it))
@ -121,38 +123,88 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
hideTab()
}
mNoneDataContainer?.isVisible = it.isEmpty()
mNoConnectionContainer?.visibility = View.GONE
mLoadingContainer?.visibility = View.GONE
showNoConnection(false)
showLoading(false)
showNoData(it.isEmpty())
}
provideViewModel().errorLiveData.observe(viewLifecycleOwner) {
mNoConnectionContainer?.visibility = View.VISIBLE
mLoadingContainer?.visibility = View.GONE
mNoConnectionContainer?.setOnClickListener {
provideViewModel().getMultiTabNav()
mNoConnectionContainer?.visibility = View.GONE
mLoadingContainer?.visibility = View.VISIBLE
}
showLoading(false)
showNoData(false)
showNoConnection(true)
}
SensorsBridge.trackEvent(
"ViewSeveralTabPage",
"bottom_tab",
mBottomTabName,
bottomTabName,
"several_tab_page_name",
mMultiTabNavName,
multiTabNavName,
"several_tab_page_id",
mMultiTabNavId
multiTabNavId
)
}
}
private fun showNoConnection(show: Boolean) {
if (show) {
if (noConnectionBinding == null) {
noConnectionStub?.setOnInflateListener { _, inflated ->
noConnectionBinding = ReuseNoConnectionBinding.bind(inflated)
noConnectionBinding?.root?.visibility = View.VISIBLE
noConnectionBinding?.connectionReloadTv?.setOnClickListener {
provideViewModel().getMultiTabNav()
showNoData(false)
showNoConnection(false)
showLoading(true)
}
}
noConnectionStub?.inflate()
} else {
noConnectionBinding?.root?.visibility = View.VISIBLE
}
} else {
noConnectionBinding?.root?.visibility = View.GONE
}
}
private fun showNoData(show: Boolean) {
if (show) {
if (noDataBinding == null) {
noDataStub?.setOnInflateListener { _, inflated ->
noDataBinding = ReuseNoneDataBinding.bind(inflated)
noDataBinding?.root?.visibility = View.VISIBLE
}
noDataStub?.inflate()
} else {
noDataBinding?.root?.visibility = View.VISIBLE
}
} else {
noDataBinding?.root?.visibility = View.GONE
}
}
private fun showLoading(show: Boolean) {
if (show) {
if (loadingBinding == null) {
loadingStub?.setOnInflateListener { _, inflated ->
loadingBinding = ReuseLoadingBinding.bind(inflated)
loadingBinding?.root?.visibility = View.VISIBLE
}
loadingStub?.inflate()
} else {
loadingBinding?.root?.visibility = View.VISIBLE
}
} else {
loadingBinding?.root?.visibility = View.GONE
}
}
abstract fun hideTab()
override fun onBackPressed(): Boolean {
mViewPager?.run {
val currentFragment = mFragmentList.safelyGetInRelease(currentItem)
viewPager?.run {
val currentFragment = fragmentList.safelyGetInRelease(currentItem)
if (currentFragment is ToolbarFragment) {
return currentFragment.onBackPressed()
}
@ -161,16 +213,16 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
}
protected open fun initViewPager(tabEntityList: ArrayList<MultiTabNav.LinkMultiTabNav>) {
mViewPager = provideViewPager()
mTabLayout = provideTabLayout()
mIndicatorView = provideIndicatorView()
viewPager = provideViewPager()
tabLayout = provideTabLayout()
indicatorView = provideIndicatorView()
val fragmentList = generateFragments(tabEntityList).apply { mFragmentList = this }
val fragmentList = generateFragments(tabEntityList).apply { fragmentList = this }
val tabTitleList = arrayListOf<String>()
tabEntityList.forEach { tabTitleList.add(it.name) }
mViewPager?.run {
viewPager?.run {
offscreenPageLimit = fragmentList.size
doOnScroll(
onPageSelected = { position ->
@ -185,10 +237,10 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
adapter = FragmentAdapter(childFragmentManager, fragmentList, tabTitleList)
}
mTabLayout?.setupWithViewPager(mViewPager)
mIndicatorView?.setupWithTabLayout(mTabLayout)
mIndicatorView?.setupWithViewPager(mViewPager)
mIndicatorView?.setIndicatorWidth(provideIndicatorWidth())
tabLayout?.setupWithViewPager(viewPager)
indicatorView?.setupWithTabLayout(tabLayout)
indicatorView?.setupWithViewPager(viewPager)
indicatorView?.setIndicatorWidth(provideIndicatorWidth())
initTabView(tabEntityList)
showTabGuideIfExists(tabEntityList)
@ -199,7 +251,7 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
if (guidePosition != -1) {
val tabEntity = tabEntityList[guidePosition]
val guide = tabEntity.guide
guide?.bottomTabId = mBottomTabId
guide?.bottomTabId = bottomTabId
guide?.multiTabId = tabEntity.id
showTabGuide(true, guide, guidePosition)
} else {
@ -257,8 +309,8 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
tryCatchInRelease {
val field = ViewPager::class.java.getDeclaredField("mRestoredCurItem")
field.isAccessible = true
field.set(viewPager, mDefaultSelectedTab)
mLastSelectedPosition = mDefaultSelectedTab
field.set(viewPager, defaultSelectedTab)
lastSelectedPosition = defaultSelectedTab
}
}
@ -267,7 +319,7 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
*/
protected open fun initTabView(tabEntityList: ArrayList<MultiTabNav.LinkMultiTabNav>) {
for (i in 0 until tabEntityList.size) {
val tabView = mTabLayout?.getTabAt(i) ?: continue
val tabView = tabLayout?.getTabAt(i) ?: continue
val tabEntity = tabEntityList[i]
val tabTitle = if (tabView.text != null) tabView.text.toString() else ""
val tabViewBinding = generateTabView(tabTitle)
@ -279,8 +331,8 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
TAB_IMAGE_HIDE_ON_SELECTED
}
mTabBindingList.add(tabViewBinding)
mTabImageStyleList.add(tabImageStyle)
tabBindingList.add(tabViewBinding)
tabImageStyleList.add(tabImageStyle)
if (tabEntity.img.isNotEmpty()) {
tabViewBinding.titleTv.visibility = View.GONE
@ -292,10 +344,10 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
tabViewBinding.titleIv.registerLoadingCallback(object : WrapContentDraweeView.LoadingCallback {
override fun loaded() {
postRunnable {
mViewPager?.run {
viewPager?.run {
// 图片 layout 完成后,更新 tabBar 和 indicatorView 的位置,避免偏移
mTabLayout?.setScrollPosition(currentItem, 0F, false)
mIndicatorView?.generatePath(currentItem, 0F)
tabLayout?.setScrollPosition(currentItem, 0F, false)
indicatorView?.generatePath(currentItem, 0F)
}
}
}
@ -339,7 +391,7 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
binding.titleTv.run {
text = title
textSize = provideTabTextSize()
setTextColor(mTabDefaultColor)
setTextColor(tabDefaultColor)
}
binding.invisibleTitleTv.run {
text = title
@ -361,9 +413,9 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
"link_type" to tabEntity.link?.type
"link_id" to tabEntity.link?.link
"link_text" to tabEntity.link?.text
"bottom_tab" to mBottomTabName
"several_tab_page_name" to mMultiTabNavName
"several_tab_page_id" to mMultiTabNavId
"bottom_tab" to bottomTabName
"several_tab_page_name" to multiTabNavName
"several_tab_page_id" to multiTabNavId
})
}
@ -371,14 +423,14 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
* 安全地从根据 position 获取 fragment
*/
protected fun getFragment(position: Int): Fragment? {
return if (position < mFragmentList.size) {
mFragmentList.safelyGetInRelease(position)
return if (position < fragmentList.size) {
fragmentList.safelyGetInRelease(position)
} else {
null
}
}
protected fun getValidSmartRefreshContent(position: Int? = mViewPager?.currentItem): ISmartRefreshContent? {
protected fun getValidSmartRefreshContent(position: Int? = viewPager?.currentItem): ISmartRefreshContent? {
if (position == null) return null
val fragment = getFragment(position)
return if (fragment?.isAdded == true) fragment as? ISmartRefreshContent else null
@ -395,7 +447,7 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
* @param currentTabSelectedColor tab选中颜色
*/
protected open fun updateTabStyle(selectedPosition: Int, positionOffset: Float, currentTabDefaultColor: Int, currentTabSelectedColor: Int) {
if (mTabBindingList.isEmpty()) return
if (tabBindingList.isEmpty()) return
val prePosition = selectedPosition - 1
val nextPosition = selectedPosition + 1
@ -403,8 +455,8 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
// positionOffset 小于零,表示 indicator 当前位置处于选中的 tab 的左边
val indicatorOnLeft = positionOffset < 0F
val selectedTabBinding = mTabBindingList.safelyGetInRelease(selectedPosition) ?: return
val selectedTabImageStyle = mTabImageStyleList.safelyGetInRelease(selectedPosition) ?: return
val selectedTabBinding = tabBindingList.safelyGetInRelease(selectedPosition) ?: return
val selectedTabImageStyle = tabImageStyleList.safelyGetInRelease(selectedPosition) ?: return
// 前一个 tab、当前选中的 tab、后一个 tab 的显示比例
val preScaleRatio = 1 + abs(positionOffset) / 4
@ -413,9 +465,9 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
// 处理前一个 tab
if (prePosition != -1) {
mTabBindingList[prePosition].run {
tabBindingList[prePosition].run {
if (indicatorOnLeft) {
when (mTabImageStyleList[prePosition]) {
when (tabImageStyleList[prePosition]) {
TAB_IMAGE_ALWAYS_ON -> {
if (isTabScaleEnabled()) {
titleIv.scaleX = preScaleRatio
@ -474,12 +526,12 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
titleTv.visibility = View.VISIBLE
invisibleTitleTv.visibility = View.INVISIBLE
mIndicatorView?.visibility = View.VISIBLE
indicatorView?.visibility = View.VISIBLE
}
}
// 选中常驻型的图片时隐藏 indicatorView
mIndicatorView?.goneIf(selectedTabImageStyle == TAB_IMAGE_ALWAYS_ON)
indicatorView?.goneIf(selectedTabImageStyle == TAB_IMAGE_ALWAYS_ON)
if (isTabScaleEnabled()) {
titleTv.scaleX = selectedScaleRatio
@ -495,10 +547,10 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
}
// 处理后一个 tab
if (nextPosition < mTabBindingList.size) {
mTabBindingList[nextPosition].run {
if (nextPosition < tabBindingList.size) {
tabBindingList[nextPosition].run {
if (!indicatorOnLeft) {
when (mTabImageStyleList[nextPosition]) {
when (tabImageStyleList[nextPosition]) {
TAB_IMAGE_ALWAYS_ON -> {
if (isTabScaleEnabled()) {
titleIv.scaleX = nextScaleRatio
@ -540,7 +592,7 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
}
// 多 tab 切换的时候可能会出现某些 tab 的文字没有回归到原始大小的问题的问题 (positionOffset 不保证连续)
for ((index, binding) in mTabBindingList.withIndex()) {
for ((index, binding) in tabBindingList.withIndex()) {
if (index != prePosition && index != selectedPosition && index != nextPosition) {
if (binding.titleTv.scaleX != 1F) {
binding.titleTv.scaleX = 1F
@ -573,8 +625,8 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
tryWithDefaultCatch {
// 补充 Viewpager Fragment 的生命周期, 先调用旧选中 fragment 的 onPause 再当前的 onResume
// 避免部分被内嵌的 Fragment 不能正常运作
if (mFragmentList.size > mLastSelectedPosition) {
val fragment: Fragment = mFragmentList[mLastSelectedPosition]
if (fragmentList.size > lastSelectedPosition) {
val fragment: Fragment = fragmentList[lastSelectedPosition]
if (!fragment.isAdded) return
fragment.onPause()
@ -584,8 +636,8 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
childFragment.onPause()
}
}
if (mFragmentList.size > currentSelectedPosition) {
val fragment: Fragment = mFragmentList[currentSelectedPosition]
if (fragmentList.size > currentSelectedPosition) {
val fragment: Fragment = fragmentList[currentSelectedPosition]
if (!fragment.isAdded) return
fragment.onResume()
@ -595,7 +647,7 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
childFragment.onResume()
}
}
mLastSelectedPosition = currentSelectedPosition
lastSelectedPosition = currentSelectedPosition
}
}
@ -610,12 +662,12 @@ abstract class BaseTabWrapperFragment : BaseLazyFragment(), IMultiTab {
override fun onDarkModeChanged() {
super.onDarkModeChanged()
mBackgroundColor = com.gh.gamecenter.common.R.color.ui_background.toColor(requireContext())
mBackgroundWhiteColor = com.gh.gamecenter.common.R.color.ui_surface.toColor(requireContext())
mAmwayPrimaryColor = com.gh.gamecenter.common.R.color.amway_primary_color.toColor(requireContext())
mTabDefaultColor = provideTabDefaultColor().toColor(requireContext())
mTabSelectedColor = provideTabSelectedColor().toColor(requireContext())
mTabDefaultLightColor = TAB_DEFAULT_COLOR_LIGHT.toColor(requireContext())
backgroundColor = com.gh.gamecenter.common.R.color.ui_background.toColor(requireContext())
backgroundWhiteColor = com.gh.gamecenter.common.R.color.ui_surface.toColor(requireContext())
amwayPrimaryColor = com.gh.gamecenter.common.R.color.amway_primary_color.toColor(requireContext())
tabDefaultColor = provideTabDefaultColor().toColor(requireContext())
tabSelectedColor = provideTabSelectedColor().toColor(requireContext())
tabDefaultLightColor = TAB_DEFAULT_COLOR_LIGHT.toColor(requireContext())
}
companion object {

View File

@ -38,7 +38,7 @@ class MainFragmentStateAdapter(private val mFragment: Fragment) : BaseDiffFragme
return if (data.link == null) {
ReloadFragment()
} else {
when (data.link!!.type) {
when (data.link.type) {
ViewPagerFragmentHelper.TYPE_CUSTOM_PAGE -> {
bundle.putParcelable(LinkEntity::class.java.simpleName, data.link)
SearchToolbarTabWrapperFragment().setSuperiorChain(superiorChain).apply { arguments = bundle }
@ -46,12 +46,12 @@ class MainFragmentStateAdapter(private val mFragment: Fragment) : BaseDiffFragme
ViewPagerFragmentHelper.TYPE_MULTI_TAB_NAV -> {
bundle.putParcelable(BottomTab.SearchStyle::class.java.simpleName, data.searchStyle)
bundle.putString(EntranceConsts.KEY_MULTI_TAB_NAV_ID, data.link!!.link)
bundle.putString(EntranceConsts.KEY_MULTI_TAB_NAV_NAME, data.link!!.text)
bundle.putString(EntranceConsts.KEY_MULTI_TAB_NAV_ID, data.link.link)
bundle.putString(EntranceConsts.KEY_MULTI_TAB_NAV_NAME, data.link.text)
SearchToolbarTabWrapperFragment().setSuperiorChain(superiorChain).apply { arguments = bundle }
}
else -> ViewPagerFragmentHelper.createFragment(mFragment, bundle, data.link!!, false)
else -> ViewPagerFragmentHelper.createFragment(mFragment, bundle, data.link, false)
}
}
}

View File

@ -27,18 +27,18 @@ import kotlin.math.roundToInt
* 二级页面-多tab导航页带Tab的外层Fragment
*/
class TabWrapperFragment: BaseTabWrapperFragment(), ISmartRefresh, ISmartRefreshContent, ISuperiorChain {
private val mBinding by lazy { FragmentTabWrapperBinding.inflate(layoutInflater) }
private val mViewModel: TabWrapperViewModel by lazy { viewModelProvider(TabWrapperViewModel.Factory(mMultiTabNavId)) }
private var mInferiorChain: PriorityChain? = null
private val mPriorityChain by lazy { PriorityChain { mInferiorChain?.start() } }
private val mMultiTabGuideHandler by lazy { MultiTabGuideHandler(24) }
private val binding by lazy { FragmentTabWrapperBinding.inflate(layoutInflater) }
private val viewModel: TabWrapperViewModel by lazy { viewModelProvider(TabWrapperViewModel.Factory(multiTabNavId)) }
private var inferiorChain: PriorityChain? = null
private val priorityChain by lazy { PriorityChain { inferiorChain?.start() } }
private val multiTabGuideHandler by lazy { MultiTabGuideHandler(24) }
override fun getLayoutId(): Int = 0
override fun getInflatedLayout(): View = mBinding.root
override fun provideViewModel(): TabWrapperViewModel = mViewModel
override fun provideTabLayout(): TabLayout = mBinding.tabLayout
override fun provideViewPager(): ViewPager = mBinding.viewPager
override fun provideIndicatorView(): TabIndicatorView = mBinding.indicatorView
override fun getInflatedLayout(): View = binding.root
override fun provideViewModel(): TabWrapperViewModel = viewModel
override fun provideTabLayout(): TabLayout = binding.tabLayout
override fun provideViewPager(): ViewPager = binding.viewPager
override fun provideIndicatorView(): TabIndicatorView = binding.indicatorView
override fun provideIndicatorWidth(): Int = 20
override fun provideTabTextSize(): Float = 14F
override fun provideTabDefaultColor(): Int = com.gh.gamecenter.common.R.color.text_secondary
@ -46,7 +46,7 @@ class TabWrapperFragment: BaseTabWrapperFragment(), ISmartRefresh, ISmartRefresh
override fun isTabScaleEnabled(): Boolean = false
override fun addTabGuideHandlerIfExists(chain: PriorityChain) {
if (isDefaultCustomPageFragment()) {
chain.addHandler(mMultiTabGuideHandler)
chain.addHandler(multiTabGuideHandler)
}
}
@ -83,7 +83,7 @@ class TabWrapperFragment: BaseTabWrapperFragment(), ISmartRefresh, ISmartRefresh
positionOffset
}
updateTabStyle(selectedPosition, positionOffsetOnRealSelectedPosition, mTabDefaultColor, mTabSelectedColor)
updateTabStyle(selectedPosition, positionOffsetOnRealSelectedPosition, tabDefaultColor, tabSelectedColor)
}
override fun onCreate(savedInstanceState: Bundle?) {
@ -98,53 +98,53 @@ class TabWrapperFragment: BaseTabWrapperFragment(), ISmartRefresh, ISmartRefresh
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
mViewModel.title.observe(viewLifecycleOwner, Observer {
viewModel.title.observe(viewLifecycleOwner, Observer {
setNavigationTitle(it)
})
}
override fun hideTab() {
mBinding.tabContainer.visibility = View.GONE
binding.tabContainer.visibility = View.GONE
}
override fun showTabGuide(shouldShow: Boolean, guide: BottomTab.Guide?, guidePosition: Int) {
if (!isDefaultCustomPageFragment()) {
mPriorityChain.addHandler(mMultiTabGuideHandler)
mPriorityChain.start()
priorityChain.addHandler(multiTabGuideHandler)
priorityChain.start()
}
if (shouldShow && guide != null && guidePosition != -1) {
mTabLayout?.post {
val tabView = mTabLayout?.getTabAt(guidePosition)?.view
tabLayout?.post {
val tabView = tabLayout?.getTabAt(guidePosition)?.view
if (tabView != null) {
if (!isDefaultCustomPageFragment() && mPriorityChain.isHandlerQueueEmpty()) {
if (!isDefaultCustomPageFragment() && priorityChain.isHandlerQueueEmpty()) {
MultiTabGuideHandler.showMultiTabGuide(
true,
requireActivity(),
mBaseHandler as BaseHandler,
guide,
mTabLayout!!,
tabLayout!!,
tabView,
false
)
} else {
mMultiTabGuideHandler.doPreProcess(
multiTabGuideHandler.doPreProcess(
true,
requireActivity(),
mBaseHandler,
guide,
mTabLayout,
tabLayout,
tabView,
false
)
}
} else {
// 不显示
mMultiTabGuideHandler.doPreProcess(false)
multiTabGuideHandler.doPreProcess(false)
}
}
} else {
mMultiTabGuideHandler.doPreProcess(false)
multiTabGuideHandler.doPreProcess(false)
}
}
@ -183,19 +183,19 @@ class TabWrapperFragment: BaseTabWrapperFragment(), ISmartRefresh, ISmartRefresh
override fun onDarkModeChanged() {
super.onDarkModeChanged()
updateTabStyle(mLastSelectedPosition, 0F, mTabDefaultColor, mTabSelectedColor)
updateTabStyle(lastSelectedPosition, 0F, tabDefaultColor, tabSelectedColor)
}
override fun registerInferiorChain(chain: PriorityChain) {
mInferiorChain = chain
if (mPriorityChain.isHandlerQueueEmpty()) {
mInferiorChain?.resume()
inferiorChain = chain
if (priorityChain.isHandlerQueueEmpty()) {
inferiorChain?.resume()
}
}
override fun unregisterInferiorChain(chain: PriorityChain) {
if (mInferiorChain == chain) {
mInferiorChain = null
if (inferiorChain == chain) {
inferiorChain = null
}
}
}