feat:初步实现首页排行榜UI效果

This commit is contained in:
max
2024-06-18 14:02:43 +08:00
parent 3dec68b1fc
commit 9d14936d9c
12 changed files with 212 additions and 36 deletions

View File

@@ -43,9 +43,6 @@ class HomeViewModel : BaseViewModel() {
private val _collectLiveData = MutableLiveData<ListResult<HomeRoomInfo>>()
val collectLiveData: LiveData<ListResult<HomeRoomInfo>> = _collectLiveData
private val _tagLiveData = MutableLiveData<List<HomeTagInfo>>()
val tagLiveData: LiveData<List<HomeTagInfo>> = _tagLiveData
private val _emptyLiveData = MutableLiveData<Boolean>()
val emptyLiveData: LiveData<Boolean> = _emptyLiveData
@@ -124,12 +121,6 @@ class HomeViewModel : BaseViewModel() {
)
}
fun getTagInfo() {
safeLaunch {
_tagLiveData.value = HomeModel.getHomeTag()
}
}
fun getGameRoom(pageNum: Int, pageSize: Int) {
safeLaunch(
onError = {

View File

@@ -0,0 +1,37 @@
package com.chwl.app.home.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import com.chwl.app.R
class HomeRankViewFlipperAdapter : BaseAdapter() {
private val list = ArrayList<List<String>>()
fun setNewData(newList: List<List<String>>) {
list.clear()
list.addAll(newList)
notifyDataSetChanged()
}
override fun getCount(): Int {
return list.size
}
override fun getItem(position: Int): Any {
return list.get(position)
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: LayoutInflater.from(parent.context)
.inflate(R.layout.home_recommend_item_rank, parent, false)
return view
}
}

View File

@@ -15,6 +15,7 @@ import com.chwl.app.base.BaseViewBindingFragment
import com.chwl.app.databinding.FragmentHomeRecommendBinding
import com.chwl.app.home.HomeViewModel
import com.chwl.app.home.adapter.HomeBannerAdapter
import com.chwl.app.home.adapter.HomeRankViewFlipperAdapter
import com.chwl.app.home.dialog.RecommendRoomDialog
import com.chwl.app.support.FragmentVisibleStateHelper
import com.chwl.app.ui.search.SearchActivity
@@ -46,10 +47,14 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
initTab()
initBanner()
initResource()
initFlipper()
homeViewModel.homeTagLiveData.observe(this) {
loadTabList(transformTabList(it))
}
homeViewModel.getHomeTagInfo()
FragmentVisibleStateHelper(this).start {
onVisibleChanged(it)
}
}
private fun initListener() {
@@ -83,20 +88,18 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
}
return@observe
}
resourceViews.forEach {
it.isVisible = true
}
for (i in resourceViews.indices) {
resourceViews[i].load(it[i].icon)
resourceViews[i].setOnClickListener { _ ->
resourceViews.forEachIndexed { index, imageView ->
imageView.isVisible = true
imageView.load(it[index].icon)
imageView.setOnClickListener { _ ->
when {
it[i].resourceType == 5 -> {
CommonWebViewActivity.start(context, it[i].resourceContent)
it[index].resourceType == 5 -> {
CommonWebViewActivity.start(context, it[index].resourceContent)
}
else -> {
dialogManager.showProgressDialog(mContext)
homeViewModel.getResourceJumpInfo(it[i].id)
homeViewModel.getResourceJumpInfo(it[index].id)
}
}
}
@@ -140,6 +143,19 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
homeViewModel.getBannerInfo()
}
private fun initFlipper() {
val rankAdapter = HomeRankViewFlipperAdapter()
binding.viewFlipper.adapter = rankAdapter
val list = ArrayList<List<String>>()
repeat(3) {
list.add(ArrayList())
}
rankAdapter.setNewData(list)
binding.viewFlipper.setInAnimation(context, R.animator.home_rank_anim_in)
binding.viewFlipper.setOutAnimation(context, R.animator.home_rank_anim_out)
binding.viewFlipper.startFlipping()
}
override fun onClick(v: View) {
when (v.id) {
R.id.tv_search -> {
@@ -239,4 +255,11 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
tabList.clear()
}
private fun onVisibleChanged(isVisible: Boolean) {
if (isVisible) {
binding.viewFlipper.startFlipping()
} else {
binding.viewFlipper.stopFlipping()
}
}
}

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="800"
android:interpolator="@android:anim/decelerate_interpolator">
<propertyValuesHolder
android:propertyName="translationY"
android:valueFrom="80dp"
android:valueTo="0"
android:valueType="floatType" />
<propertyValuesHolder
android:duration="300"
android:propertyName="alpha"
android:valueFrom="0.4"
android:valueTo="1.0"
android:valueType="floatType" />
</objectAnimator>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="400"
android:interpolator="@android:anim/accelerate_interpolator">
<propertyValuesHolder
android:propertyName="translationY"
android:valueFrom="0"
android:valueTo="-20dp"
android:valueType="floatType" />
<propertyValuesHolder
android:propertyName="alpha"
android:valueFrom="1.0"
android:valueTo="0.0"
android:valueType="floatType" />
</objectAnimator>

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -35,7 +35,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.makeramen.roundedimageview.RoundedImageView
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/iv_resource0"
android:layout_width="@dimen/dp_0"
android:layout_height="0dp"
@@ -47,11 +47,21 @@
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_corner_radius="@dimen/dp_4"
app:shapeAppearance="@style/shape_corner_4dp"
tools:src="@drawable/default_banner"
tools:visibility="visible" />
<com.makeramen.roundedimageview.RoundedImageView
<AdapterViewFlipper
android:id="@+id/view_flipper"
android:layout_width="0dp"
android:layout_height="0dp"
android:flipInterval="5000"
app:layout_constraintBottom_toBottomOf="@id/iv_resource0"
app:layout_constraintEnd_toEndOf="@id/iv_resource0"
app:layout_constraintStart_toStartOf="@id/iv_resource0"
app:layout_constraintTop_toTopOf="@id/iv_resource0" />
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/iv_resource1"
android:layout_width="@dimen/dp_0"
android:layout_height="@dimen/dp_0"
@@ -64,7 +74,7 @@
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toEndOf="@+id/iv_resource0"
app:layout_constraintTop_toTopOf="@id/iv_resource0"
app:riv_corner_radius="@dimen/dp_4"
app:shapeAppearance="@style/shape_corner_4dp"
tools:src="@drawable/default_banner"
tools:visibility="visible" />

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="#000000"
tools:layout_height="82dp"
tools:layout_width="170dp">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/iv_rank_1"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/default_avatar"
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_1"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="@id/iv_rank_border_1"
app:layout_constraintStart_toStartOf="@id/iv_rank_border_1"
app:layout_constraintTop_toTopOf="@id/iv_rank_border_1"
app:layout_constraintVertical_bias="0.896"
app:layout_constraintWidth_percent="0.2"
app:shapeAppearance="@style/shape_circle" />
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/iv_rank_2"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/default_avatar"
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_2"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="@id/iv_rank_border_2"
app:layout_constraintStart_toStartOf="@id/iv_rank_border_2"
app:layout_constraintTop_toTopOf="@id/iv_rank_border_2"
app:layout_constraintVertical_bias="0.772"
app:layout_constraintWidth_percent="0.126"
app:shapeAppearance="@style/shape_circle" />
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/iv_rank_3"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/default_avatar"
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_3"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="@id/iv_rank_border_3"
app:layout_constraintStart_toStartOf="@id/iv_rank_border_3"
app:layout_constraintTop_toTopOf="@id/iv_rank_border_3"
app:layout_constraintVertical_bias="0.772"
app:layout_constraintWidth_percent="0.126"
app:shapeAppearance="@style/shape_circle" />
<ImageView
android:id="@+id/iv_rank_border_1"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/home_rank_1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="62:48.5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.268"
app:layout_constraintWidth_percent="0.364" />
<ImageView
android:id="@+id/iv_rank_border_2"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/home_rank_2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="42.5:33"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.164"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.683"
app:layout_constraintWidth_percent="0.25" />
<ImageView
android:id="@+id/iv_rank_border_3"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/home_rank_3"
app:layout_constraintBottom_toBottomOf="@id/iv_rank_border_2"
app:layout_constraintDimensionRatio="42.5:33"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.835"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_rank_border_2"
app:layout_constraintWidth_percent="0.25" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -605,6 +605,11 @@
<item name="cornerSize">50%</item>
</style>
<style name="shape_corner_4dp">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">@dimen/dp_4</item>
</style>
<style name="shape_corner_5dp">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">@dimen/dp_5</item>

View File

@@ -114,12 +114,6 @@ object HomeModel : BaseModel() {
api.getGameRoom(pageNum, pageSize)
}
suspend fun getHomeTag(): List<HomeTagInfo>? =
launchRequest {
api.getHomeTag()
}
suspend fun getConcernsRoom(): List<HomeRoomInfo>? =
launchRequest {
api.getConcernsRoom()
@@ -350,14 +344,6 @@ object HomeModel : BaseModel() {
@Query("pageSize") pageSize: Int
): ServiceResult<List<HomeRoomInfo>>
/**
* 首页派对 Tag List
*
* @return
*/
@GET("/home/tagV2")
suspend fun getHomeTag(): ServiceResult<List<HomeTagInfo>>
/**
* 首页派对 Tag List
*