feat: 메인 홈
- 오디션 배너 UI 추가
This commit is contained in:
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.player.AudioContentPlayerService
|
||||||
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
|
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
|
||||||
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
|
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.base.BaseFragment
|
||||||
import kr.co.vividnext.sodalive.common.Constants
|
import kr.co.vividnext.sodalive.common.Constants
|
||||||
import kr.co.vividnext.sodalive.common.LoadingDialog
|
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 contentBannerAdapter: AudioContentMainBannerAdapter
|
||||||
private lateinit var originalSeriesAdapter: HomeSeriesAdapter
|
private lateinit var originalSeriesAdapter: HomeSeriesAdapter
|
||||||
|
|
||||||
|
private lateinit var auditionAdapter: AuditionBannerAdapter
|
||||||
|
|
||||||
private val handler = Handler(Looper.getMainLooper())
|
private val handler = Handler(Looper.getMainLooper())
|
||||||
|
|
||||||
private val preferenceChangeListener =
|
private val preferenceChangeListener =
|
||||||
@@ -158,6 +161,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
setupLatestContent()
|
setupLatestContent()
|
||||||
setupContentBanner()
|
setupContentBanner()
|
||||||
setupOriginalSeries()
|
setupOriginalSeries()
|
||||||
|
setupAudition()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupLiveView() {
|
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_909090),
|
||||||
ContextCompat.getColor(requireContext(), R.color.color_3bb9f1)
|
ContextCompat.getColor(requireContext(), R.color.color_3bb9f1)
|
||||||
)
|
)
|
||||||
.setIndicatorSliderWidth(4f.dpToPx().toInt(), 10f.dpToPx().toInt())
|
.setIndicatorSliderWidth(10f.dpToPx().toInt(), 10f.dpToPx().toInt())
|
||||||
.setIndicatorHeight(4f.dpToPx().toInt())
|
.setIndicatorHeight(10f.dpToPx().toInt())
|
||||||
|
|
||||||
viewModel.eventBannerListLiveData.observe(viewLifecycleOwner) {
|
viewModel.eventBannerListLiveData.observe(viewLifecycleOwner) {
|
||||||
if (
|
if (
|
||||||
@@ -570,10 +574,12 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
outRect.left = 0
|
outRect.left = 0
|
||||||
outRect.right = 8f.dpToPx().toInt()
|
outRect.right = 8f.dpToPx().toInt()
|
||||||
}
|
}
|
||||||
|
|
||||||
originalSeriesAdapter.itemCount - 1 -> {
|
originalSeriesAdapter.itemCount - 1 -> {
|
||||||
outRect.left = 8f.dpToPx().toInt()
|
outRect.left = 8f.dpToPx().toInt()
|
||||||
outRect.right = 0
|
outRect.right = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
outRect.left = 8f.dpToPx().toInt()
|
outRect.left = 8f.dpToPx().toInt()
|
||||||
outRect.right = 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() {
|
private fun bindData() {
|
||||||
viewModel.isLoading.observe(viewLifecycleOwner) {
|
viewModel.isLoading.observe(viewLifecycleOwner) {
|
||||||
if (it) {
|
if (it) {
|
||||||
|
|||||||
@@ -184,7 +184,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:layout_marginTop="6.7dp" />
|
android:layout_marginTop="28dp" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
@@ -232,7 +232,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:layout_marginTop="6.7dp" />
|
android:layout_marginTop="28dp" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
|
|||||||
@@ -7,5 +7,6 @@
|
|||||||
android:id="@+id/iv_recommend_live"
|
android:id="@+id/iv_recommend_live"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:scaleType="centerCrop"
|
||||||
android:contentDescription="@null" />
|
android:contentDescription="@null" />
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|||||||
Reference in New Issue
Block a user