feat: 메인 홈

- 오디션 배너 UI 추가
This commit is contained in:
2025-07-15 16:27:14 +09:00
parent af818bda93
commit e787872cc5
4 changed files with 122 additions and 4 deletions

View File

@@ -0,0 +1,54 @@
package kr.co.vividnext.sodalive.home
import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.widget.FrameLayout
import android.widget.ImageView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import com.zhpan.bannerview.BaseBannerAdapter
import com.zhpan.bannerview.BaseViewHolder
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audition.GetAuditionListItem
class AuditionBannerAdapter(
private val context: Context,
private val itemWidth: Int,
private val itemHeight: Int,
private val onClick: (Long) -> Unit
) : BaseBannerAdapter<GetAuditionListItem>() {
override fun bindData(
holder: BaseViewHolder<GetAuditionListItem>,
data: GetAuditionListItem,
position: Int,
pageSize: Int
) {
val ivBanner = holder.findViewById<ImageView>(R.id.iv_recommend_live)
val layoutParams = ivBanner.layoutParams as FrameLayout.LayoutParams
layoutParams.width = itemWidth
layoutParams.height = itemHeight
Glide
.with(context)
.asBitmap()
.load(data.imageUrl)
.into(object : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
ivBanner.layoutParams = layoutParams
ivBanner.setImageBitmap(resource)
}
override fun onLoadCleared(placeholder: Drawable?) {
}
})
ivBanner.setOnClickListener { onClick(data.id) }
}
override fun getLayoutId(viewType: Int): Int {
return R.layout.item_recommend_live
}
}

View File

@@ -32,6 +32,7 @@ import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBanner
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
import kr.co.vividnext.sodalive.audition.detail.AuditionDetailActivity
import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.LoadingDialog
@@ -69,6 +70,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
private lateinit var originalSeriesAdapter: HomeSeriesAdapter
private lateinit var auditionAdapter: AuditionBannerAdapter
private val handler = Handler(Looper.getMainLooper())
private val preferenceChangeListener =
@@ -158,6 +161,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
setupLatestContent()
setupContentBanner()
setupOriginalSeries()
setupAudition()
}
private fun setupLiveView() {
@@ -510,8 +514,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
ContextCompat.getColor(requireContext(), R.color.color_909090),
ContextCompat.getColor(requireContext(), R.color.color_3bb9f1)
)
.setIndicatorSliderWidth(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
.setIndicatorHeight(4f.dpToPx().toInt())
.setIndicatorSliderWidth(10f.dpToPx().toInt(), 10f.dpToPx().toInt())
.setIndicatorHeight(10f.dpToPx().toInt())
viewModel.eventBannerListLiveData.observe(viewLifecycleOwner) {
if (
@@ -570,10 +574,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
outRect.left = 0
outRect.right = 8f.dpToPx().toInt()
}
originalSeriesAdapter.itemCount - 1 -> {
outRect.left = 8f.dpToPx().toInt()
outRect.right = 0
}
else -> {
outRect.left = 8f.dpToPx().toInt()
outRect.right = 8f.dpToPx().toInt()
@@ -593,6 +599,63 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}
}
private fun setupAudition() {
val layoutParams = binding
.eventBannerSlider
.layoutParams as LinearLayout.LayoutParams
val pagerWidth = screenWidth.toDouble()
val pagerHeight = (pagerWidth * 120 / 352).roundToInt()
layoutParams.width = pagerWidth.roundToInt()
layoutParams.height = pagerHeight
auditionAdapter = AuditionBannerAdapter(
requireContext(),
pagerWidth.roundToInt(),
pagerHeight
) {
startActivity(
Intent(requireContext(), AuditionDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDITION_ID, it)
}
)
}
binding
.auditionSlider
.layoutParams = layoutParams
binding.auditionSlider.apply {
adapter = auditionAdapter as BaseBannerAdapter<Any>
setLifecycleRegistry(lifecycle)
setScrollDuration(1000)
setInterval(4 * 1000)
}.create()
binding
.auditionSlider
.setIndicatorView(binding.indicatorAudition)
.setIndicatorStyle(IndicatorStyle.ROUND_RECT)
.setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
.setIndicatorVisibility(View.GONE)
.setIndicatorSliderColor(
ContextCompat.getColor(requireContext(), R.color.color_909090),
ContextCompat.getColor(requireContext(), R.color.color_3bb9f1)
)
.setIndicatorSliderWidth(10f.dpToPx().toInt(), 10f.dpToPx().toInt())
.setIndicatorHeight(10f.dpToPx().toInt())
viewModel.auditionListLiveData.observe(viewLifecycleOwner) {
if (it.isNotEmpty()) {
binding.llAudition.visibility = View.VISIBLE
binding.auditionSlider.refreshData(it)
} else {
binding.llAudition.visibility = View.GONE
}
}
}
private fun bindData() {
viewModel.isLoading.observe(viewLifecycleOwner) {
if (it) {

View File

@@ -184,7 +184,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
android:layout_marginTop="28dp" />
</LinearLayout>
<LinearLayout
@@ -232,7 +232,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="6.7dp" />
android:layout_marginTop="28dp" />
</LinearLayout>
<LinearLayout

View File

@@ -7,5 +7,6 @@
android:id="@+id/iv_recommend_live"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:contentDescription="@null" />
</FrameLayout>