feat: 优化首页多Tab导航页渲染速度
This commit is contained in:
@ -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?
|
||||
}
|
||||
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user