Ver Fonte

feat:新增历史榜单切换入口 (#23)

* feat: 榜单增加查询历史功能

* feat: 榜单问题修改
WilliumP há 7 meses atrás
pai
commit
65983e1f41

+ 0 - 11
module/rank/src/main/java/com/adealink/weparty/rank/RankActivity.kt

@@ -7,7 +7,6 @@ import android.view.View
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.view.updateLayoutParams
 import androidx.fragment.app.Fragment
-import androidx.viewpager2.widget.ViewPager2
 import com.adealink.frame.aab.util.getCompatColor
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
@@ -93,16 +92,6 @@ class RankActivity : BaseActivity() {
         binding.vpContent.apply {
             isUserInputEnabled = false
             adapter = rankPageAdapter
-            registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
-                override fun onPageSelected(pos: Int) {
-                    super.onPageSelected(pos)
-                    val fm = rankPageAdapter.getFragmentByPos(pos)
-                    binding.rankTransitionTopIv.alpha = 1f
-                    fm?.setOnAppBarScrollChangeListener { alpha ->
-                        binding.rankTransitionTopIv.alpha = 1f - alpha
-                    }
-                }
-            })
         }
 
         TabLayoutMediator(binding.typeTabLayout, binding.vpContent) { tab, position ->

+ 21 - 11
module/rank/src/main/java/com/adealink/weparty/rank/ranklist/RankFragment.kt

@@ -3,9 +3,11 @@ package com.adealink.weparty.rank.ranklist
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
+import android.widget.ImageView
 import android.widget.TextView
 import androidx.core.view.updateLayoutParams
 import androidx.fragment.app.Fragment
+import androidx.viewpager2.widget.ViewPager2
 import com.adealink.frame.aab.util.getCompatColor
 import com.adealink.frame.aab.util.getCompatDrawable
 import com.adealink.frame.aab.util.getCompatString
@@ -105,6 +107,16 @@ class RankFragment: BaseFragment(R.layout.fragment_rank) {
     private fun setupTimeTabLayout() {
         binding.vpRank.apply {
             adapter = rankListPageAdapter
+            registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+                override fun onPageSelected(pos: Int) {
+                    super.onPageSelected(pos)
+                    val fm = rankListPageAdapter.getFragmentByPos(pos)
+                    val view = activity?.findViewById<ImageView>(R.id.rank_transition_top_iv).also { it?.alpha = 1f }
+                    fm?.setOnAppBarScrollChangeListener { alpha ->
+                        view?.alpha = 1f - alpha
+                    }
+                }
+            })
         }
 
         TabLayoutMediator(binding.timeTabLayout, binding.vpRank) { tab, position ->
@@ -185,12 +197,6 @@ class RankFragment: BaseFragment(R.layout.fragment_rank) {
                 gender = type.value
                 submitList(genderTypeList)
                 view.text = type.name
-                view.setCompoundDrawablesRelativeWithIntrinsicBounds(
-                    null,
-                    null,
-                    getCompatDrawable(APP_R.drawable.common_down_arrow_32_ic),
-                    null
-                )
                 updateRankListByGender(type.value)
                 popup?.dismiss()
             })
@@ -201,13 +207,21 @@ class RankFragment: BaseFragment(R.layout.fragment_rank) {
             .shadow(true)
             .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER)
             .preferredDirection(QMUIPopup.DIRECTION_BOTTOM)
+            .onDismiss {
+                view.setCompoundDrawablesRelativeWithIntrinsicBounds(
+                    null,
+                    null,
+                    getCompatDrawable(APP_R.drawable.common_down_arrow_32_ic),
+                    null
+                )
+            }
             .radius(8.dp())
         popup.show(view)
     }
 
     private fun updateRankList() {
         val pos = TIME_LIST.indexOf(time)
-        rankListPageAdapter.getFragmentByPos(pos)?.updateUIStyle(time)
+        rankListPageAdapter.getFragmentByPos(pos)?.scrollToTop()
     }
 
     private fun updateRankListByGender(genderValue: Int) {
@@ -216,10 +230,6 @@ class RankFragment: BaseFragment(R.layout.fragment_rank) {
         }
     }
 
-    fun setOnAppBarScrollChangeListener(onScrollChange: (Float) -> Unit) {
-        rankListPageAdapter.getFragmentByPos(TIME_LIST.indexOf(time))?.setOnAppBarScrollChangeListener(onScrollChange)
-    }
-
     internal inner class RankListPageAdapter : BaseTabFragmentStateAdapter(this) {
 
         override fun getTabName(pos: Int): String {

+ 33 - 10
module/rank/src/main/java/com/adealink/weparty/rank/ranklist/RankLayoutChangeWrapper.kt

@@ -1,5 +1,7 @@
 package com.adealink.weparty.rank.ranklist
 
+import androidx.lifecycle.LifecycleOwner
+import com.adealink.frame.mvvm.view.ViewComponent
 import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.module.profile.data.Gender
@@ -8,17 +10,23 @@ import com.adealink.weparty.module.rank.data.RankItemData
 import com.adealink.weparty.rank.constant.TYPE_TOP_CP
 import com.adealink.weparty.rank.constant.TYPE_TOP_STAR
 import com.adealink.weparty.rank.databinding.FragmentRankListBinding
+import com.adealink.weparty.rank.ranklist.topthree.BottomDelegate
 import com.adealink.weparty.rank.ranklist.topthree.CoupleBottomDelegate
 import com.adealink.weparty.rank.ranklist.topthree.CoupleTopThreeDelegate
 import com.adealink.weparty.rank.ranklist.topthree.NormalBottomDelegate
 import com.adealink.weparty.rank.ranklist.topthree.NormalTopThreeDelegate
+import com.adealink.weparty.rank.ranklist.topthree.TopThreeDelegate
 
-class RankLayoutChangeWrapper(val binding: FragmentRankListBinding, private val type: Int) {
-    private val normalTop = NormalTopThreeDelegate(binding.layoutRankTopThree, type)
-    private val cpTop = CoupleTopThreeDelegate(binding.layoutCoupleTopThree)
+class RankLayoutChangeWrapper(
+    lifecycleOwner: LifecycleOwner,
+    val binding: FragmentRankListBinding,
+    private val type: Int,
+) : ViewComponent(lifecycleOwner) {
+    private val normalTop: TopThreeDelegate<RankItemData> = NormalTopThreeDelegate(binding.layoutRankTopThree, type)
+    private val cpTop: TopThreeDelegate<CoupleRankItemData> = CoupleTopThreeDelegate(binding.layoutCoupleTopThree)
 
-    private val normalBottom = NormalBottomDelegate(binding.layoutRankBottom, type)
-    private val cpBottom = CoupleBottomDelegate(binding.layoutCoupleBottom)
+    private val normalBottom: BottomDelegate<RankItemData> = NormalBottomDelegate(binding.layoutRankBottom, type)
+    private val cpBottom: BottomDelegate<CoupleRankItemData> = CoupleBottomDelegate(binding.layoutCoupleBottom)
 
     init {
         setType(type)
@@ -44,11 +52,7 @@ class RankLayoutChangeWrapper(val binding: FragmentRankListBinding, private val
 
     fun updateCoupleItem(item: CoupleRankItemData?) {
         cpBottom.updateMyItem(item)
-        val bottomPadding = when {
-            item == null -> 0
-            else -> 72.dp()
-        }
-        binding.rvRankList.setPadding(0, 0, 0, bottomPadding)
+        binding.rvRankList.setPadding(0, 0, 0, 72.dp())
     }
 
     private fun setType(rankType: Int) {
@@ -64,4 +68,23 @@ class RankLayoutChangeWrapper(val binding: FragmentRankListBinding, private val
             cpBottom.show()
         }
     }
+
+    override fun onResume() {
+        super.onResume()
+        when(type) {
+            TYPE_TOP_CP -> {
+                cpTop.startAnim()
+            }
+            else -> {
+                normalTop.startAnim()
+            }
+        }
+
+    }
+
+    override fun onPause() {
+        super.onPause()
+        normalTop.stopAnim()
+        cpTop.stopAnim()
+    }
 }

+ 22 - 16
module/rank/src/main/java/com/adealink/weparty/rank/ranklist/RankListFragment.kt

@@ -12,7 +12,6 @@ import com.adealink.frame.log.Log
 import com.adealink.frame.mvvm.lifecycle.observeOnDestroy
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.weparty.commonui.BaseFragment
-import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.diffutil.BaseListDiffUtil
 import com.adealink.weparty.module.rank.data.CoupleRankListResult
@@ -41,6 +40,8 @@ import kotlin.math.abs
 class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
 
     companion object {
+        const val TAG = "RankListFragment"
+
         fun newInstance(
             type: Int = TYPE_TOP_GIFT, time: Int = TIME_DAILY, gender: Int = TYPE_ALL
         ): RankListFragment {
@@ -61,6 +62,7 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
     private val listAdapter by lazy { MultiTypeListAdapter(BaseListDiffUtil()) }
     private val rankListViewModel by viewModels<RankListViewModel> { RankViewModelFactory() }
     private val binding by viewBinding(FragmentRankListBinding::bind)
+    //切换榜单、刷新、筛选时触发
     private val scrollTopRunnable = Runnable {
         if (!isUIValid()) {
             return@Runnable
@@ -72,6 +74,15 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
     private var rankLayoutChangeWrapper: RankLayoutChangeWrapper? = null
     private val rankListCache: MutableList<RankItemData> = mutableListOf()
     private var showPreviousRank = false
+    private var isScrollListenerExist = false
+    private val bgDrawableRes
+        get() = when(type) {
+            TYPE_TOP_GIFT -> R.drawable.rank_wealth_previous_bg
+            TYPE_TOP_STAR -> R.drawable.rank_charm_previous_bg
+            TYPE_TOP_PARTY -> R.drawable.rank_room_previous_bg
+            TYPE_TOP_CP -> R.drawable.rank_cp_previous_bg
+            else -> 0
+        }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
@@ -82,17 +93,17 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
 
     override fun initViews() {
         parseIntent()
-        rankLayoutChangeWrapper = RankLayoutChangeWrapper(binding, type)
+        rankLayoutChangeWrapper = RankLayoutChangeWrapper(this, binding, type).also { it.attach() }
         listAdapter.register(RankItemViewBinder())
         listAdapter.register(CoupleRankItemViewBinder())
         listAdapter.register(RankListErrorEmptyViewBinder())
         binding.rvRankList.layoutManager = LinearLayoutManager(requireActivity())
         binding.rvRankList.adapter = listAdapter
-        updateUIStyle(time)
         binding.refreshLayout.setEnableLoadMore(false)
         binding.refreshLayout.setOnRefreshListener {
-            requestListData()
+            requestListData(showPreviousRank)
         }
+        binding.tvPrevious.setBackgroundResource(bgDrawableRes)
         binding.tvPrevious.setOnClickListener {
             showPreviousRank = !showPreviousRank
             if (showPreviousRank) {
@@ -103,6 +114,7 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
                 requestListData()
             }
         }
+        requestListData(showPreviousRank)
     }
 
     private fun parseIntent() {
@@ -121,7 +133,7 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
     }
 
     private fun requestListData(pullHistory: Boolean = false) {
-        Log.d("PWL", "requestListData type: $type, time: $time, gender: $gender, pullHistory: $pullHistory")
+        Log.d(TAG, "requestListData type: $type, time: $time, gender: $gender, pullHistory: $pullHistory")
         when(type) {
             TYPE_TOP_GIFT,
             TYPE_TOP_STAR -> {
@@ -136,19 +148,11 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
         }
     }
 
-    /**
-     * 切换榜单类型时,改变UI风格;
-     */
-    fun updateUIStyle(time: Int) {
+    fun scrollToTop() {
         if (!isViewBindingValid()) {
             return
         }
-        this.time = time
-        binding.tvPrevious.show(type == TYPE_TOP_GIFT)
-        showPreviousRank = false
-        binding.tvPrevious.text = getCompatString(R.string.rank_previous)
         binding.rvRankList.post(scrollTopRunnable)
-        requestListData()
     }
 
     fun updateByGender(gender: Int) {
@@ -173,6 +177,7 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
 
     // ---- 排行榜列表 ---- Start
     private fun resultGetRankList(result: RankListResult) {
+        binding.rvRankList.post(scrollTopRunnable)
         binding.refreshLayout.finishRefresh()
         if(!result.isNetOK) {
             rankLayoutChangeWrapper?.updateRankList(emptyList())
@@ -203,6 +208,7 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
     }
 
     private fun resultGetCoupleRankList(result: CoupleRankListResult) {
+        binding.rvRankList.post(scrollTopRunnable)
         binding.refreshLayout.finishRefresh()
         if(!result.isNetOK) {
             rankLayoutChangeWrapper?.updateCoupleList(emptyList())
@@ -237,10 +243,10 @@ class RankListFragment : BaseFragment(R.layout.fragment_rank_list) {
     }
 
     fun setOnAppBarScrollChangeListener(onScrollChange: (Float) -> Unit) {
-        if (!isViewBindingValid()) {
+        if (!isViewBindingValid() || isScrollListenerExist) {
             return
         }
-
+        isScrollListenerExist = true
         val layoutParams = binding.appBarLayout.layoutParams as CoordinatorLayout.LayoutParams
         val behavior = layoutParams.behavior
         if (behavior is AppBarLayout.Behavior) {

+ 18 - 0
module/rank/src/main/java/com/adealink/weparty/rank/ranklist/topthree/CoupleTopThreeDelegate.kt

@@ -92,6 +92,24 @@ class CoupleTopThreeDelegate(private val binding: RankCoupleTopThreeLayoutBindin
         binding.root.visibility = View.GONE
     }
 
+    override fun startAnim() {
+        binding.svgaTop1Left.startAnimation()
+        binding.svgaTop2Left.startAnimation()
+        binding.svgaTop3Left.startAnimation()
+        binding.svgaTop1Right.startAnimation()
+        binding.svgaTop2Right.startAnimation()
+        binding.svgaTop3Right.startAnimation()
+    }
+
+    override fun stopAnim() {
+        binding.svgaTop1Left.stopAnimation()
+        binding.svgaTop2Left.stopAnimation()
+        binding.svgaTop3Left.stopAnimation()
+        binding.svgaTop1Right.stopAnimation()
+        binding.svgaTop2Right.stopAnimation()
+        binding.svgaTop3Right.stopAnimation()
+    }
+
     companion object {
         private val femaleTop1Frame = ossService.getUrlByPath("/big_img/rank/cp_female_top1_frame.svga")
         private val femaleTop2Frame = ossService.getUrlByPath("/big_img/rank/cp_female_top2_frame.svga")

+ 13 - 2
module/rank/src/main/java/com/adealink/weparty/rank/ranklist/topthree/NormalTopThreeDelegate.kt

@@ -95,8 +95,6 @@ class NormalTopThreeDelegate(private val binding: RankTopThreeLayoutBinding, pri
             binding.liveMarkThird,
             binding.userContainerThird
         )
-
-
     }
 
     private fun updateTopItem(
@@ -112,6 +110,7 @@ class NormalTopThreeDelegate(private val binding: RankTopThreeLayoutBinding, pri
             tvNickname.text = getCompatString(APP_R.string.common_none)
             ivAvatar.setImageUrl(null)
             tvValue.visibility = View.INVISIBLE
+            rankLive.gone()
             extraInfoBinding.root.gone()
             return
         }
@@ -185,6 +184,18 @@ class NormalTopThreeDelegate(private val binding: RankTopThreeLayoutBinding, pri
         binding.root.visibility = View.GONE
     }
 
+    override fun startAnim() {
+        binding.svgaAvatarBgFirst.startAnimation()
+        binding.svgaAvatarBgSecond.startAnimation()
+        binding.svgaAvatarBgThird.startAnimation()
+    }
+
+    override fun stopAnim() {
+        binding.svgaAvatarBgFirst.stopAnimation()
+        binding.svgaAvatarBgSecond.stopAnimation()
+        binding.svgaAvatarBgThird.stopAnimation()
+    }
+
     companion object {
         private val normalTop1Frame = ossService.getUrlByPath("/big_img/rank/normal_rank_top1_frame.svga")
         private val normalTop2Frame = ossService.getUrlByPath("/big_img/rank/normal_rank_top2_frame.svga")

+ 4 - 0
module/rank/src/main/java/com/adealink/weparty/rank/ranklist/topthree/TopThreeDelegate.kt

@@ -7,4 +7,8 @@ interface TopThreeDelegate<T> {
     fun show()
 
     fun hide()
+
+    fun startAnim()
+
+    fun stopAnim()
 }

+ 6 - 0
module/rank/src/main/res/drawable/rank_charm_previous_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#6E31D7"/>
+    <corners android:radius="32dp" />
+</shape>

+ 6 - 0
module/rank/src/main/res/drawable/rank_cp_previous_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#F25EAA"/>
+    <corners android:radius="32dp" />
+</shape>

+ 6 - 0
module/rank/src/main/res/drawable/rank_room_previous_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#3868E2"/>
+    <corners android:radius="32dp" />
+</shape>