首页金币获取逻辑及UI

This commit is contained in:
renhaoting 2025-11-28 18:07:11 +08:00
parent df87261b62
commit f5162cb3a8
9 changed files with 180 additions and 26 deletions

View File

@ -6,4 +6,7 @@ object VididinEvents {
const val Event_Account_Cash_Changed = 602 const val Event_Account_Cash_Changed = 602
const val Event_Account_Bank_Info_Changed = 603 const val Event_Account_Bank_Info_Changed = 603
const val Event_HOME_WATCH_Time_TICK = 700
} }

View File

@ -15,10 +15,14 @@ import com.ama.core.architecture.appBase.AppViewsFragment
import com.ama.core.architecture.appBase.OnFragmentBackgroundListener import com.ama.core.architecture.appBase.OnFragmentBackgroundListener
import com.ama.core.architecture.util.setStatusBarDarkFont import com.ama.core.architecture.util.setStatusBarDarkFont
import com.ama.core.common.util.asSafe import com.ama.core.common.util.asSafe
import com.gamedog.vididin.VididinEvents
import com.gamedog.vididin.core.login.login.AccountManager
import com.gamedog.vididin.main.fragments.home.HomeFragmentStateAdapter import com.gamedog.vididin.main.fragments.home.HomeFragmentStateAdapter
import com.gamedog.vididin.main.fragments.home.fragment.HomeItemFragment import com.gamedog.vididin.main.fragments.home.fragment.HomeItemFragment
import com.gamedog.vididin.main.interfaces.OnSwitchTabListener import com.gamedog.vididin.main.interfaces.OnSwitchTabListener
import com.gamedog.vididin.main.interfaces.OnTabStyleListener import com.gamedog.vididin.main.interfaces.OnTabStyleListener
import com.gamedog.vididin.youtubestatistic.RewardConst
import com.gamedog.vididin.youtubestatistic.TickerTimer
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.getValue import kotlin.getValue
@ -31,6 +35,7 @@ import com.gamedog.vididin.main.fragments.home.YoutubeUiState as UiState
@AndroidEntryPoint @AndroidEntryPoint
class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwitchTabListener, OnFragmentBackgroundListener { class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwitchTabListener, OnFragmentBackgroundListener {
private var mTotalMs: Long = 0L
override val mViewModel: ViewModel by viewModels() override val mViewModel: ViewModel by viewModels()
override var isBackgroundBright: Boolean = true override var isBackgroundBright: Boolean = true
@ -54,6 +59,22 @@ class HomeFragment : AppViewsFragment<ViewBinding, UiState, ViewModel>(), OnSwit
viewPager2.setPageTransformer { _, _ -> } viewPager2.setPageTransformer { _, _ -> }
viewPager2.offscreenPageLimit = 1 viewPager2.offscreenPageLimit = 1
viewPager2.adapter = mViewPagerAdapter viewPager2.adapter = mViewPagerAdapter
registerEvents({
handleWatchTimeTick()
}, VididinEvents.Event_HOME_WATCH_Time_TICK,)
}
private fun handleWatchTimeTick() {
mTotalMs += TickerTimer.Notify_Interval_MS
if (mTotalMs < RewardConst.HOME_WATCH_DURATION) {
binding?.dragIconView?.setProgress(mTotalMs * 100/RewardConst.HOME_WATCH_DURATION)
} else {
mTotalMs = 0L
binding?.dragIconView?.setProgress(mTotalMs * 100/ RewardConst.HOME_WATCH_DURATION)
AccountManager.addGold(RewardConst.HOME_WATCH_REWARD_NUM)
binding?.dragIconView?.showRewardGoldAnim()
}
} }
override fun ViewBinding.initListeners() { override fun ViewBinding.initListeners() {

View File

@ -18,6 +18,7 @@ import com.gamedog.vididin.beans.YoutubeVideo
import com.gamedog.vididin.main.WatchVideoDialog import com.gamedog.vididin.main.WatchVideoDialog
import com.gamedog.vididin.router.Router import com.gamedog.vididin.router.Router
import com.gamedog.vididin.widget.MyPlayerControlView import com.gamedog.vididin.widget.MyPlayerControlView
import com.gamedog.vididin.youtubestatistic.TickerTimer
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.PlayerConstants
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer
import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener
@ -34,6 +35,7 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
private var mIsPlaying: Boolean = false private var mIsPlaying: Boolean = false
private var mCurPlayedSecond: Float = 0F private var mCurPlayedSecond: Float = 0F
private var mTotalDuration: Float = -1F private var mTotalDuration: Float = -1F
private val mTickerTimer = TickerTimer()
override fun inflateViewBinding( override fun inflateViewBinding(
@ -167,6 +169,8 @@ class HomeItemFragment : AppViewsEmptyViewModelFragment<ViewBinding>() {
} else { } else {
showPlayIconAnim() showPlayIconAnim()
} }
if (mIsPlaying) mTickerTimer.start() else mTickerTimer.pause()
} }
} }

View File

@ -10,7 +10,6 @@ import android.view.LayoutInflater
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.gamedog.vididin.databinding.LayoutDragIconViewBinding import com.gamedog.vididin.databinding.LayoutDragIconViewBinding
import com.gamedog.vididin.manager.TaskManager
class HomeDragIconView @JvmOverloads constructor( class HomeDragIconView @JvmOverloads constructor(
context: Context, context: Context,
@ -24,45 +23,36 @@ class HomeDragIconView @JvmOverloads constructor(
init { init {
mBinding = LayoutDragIconViewBinding.inflate(LayoutInflater.from(context), this, true) mBinding = LayoutDragIconViewBinding.inflate(LayoutInflater.from(context), this, true)
mBinding.run { mBinding.run {
progressBar.setProgressListener { progress->
if (progress >= 100) {
tvGoldNum.text = buildString {
append("+")
append(TaskManager.instance().getHomeWatchDurationRewardNum())
}
executeGoldNumAnim()
}
}
} }
} }
private fun executeGoldNumAnim() { fun showRewardGoldAnim() {
val animView = mBinding.llGoldRoot val animView = mBinding.llGoldRoot
val alphaAnimator = ObjectAnimator.ofFloat( val alphaAnimator = ObjectAnimator.ofFloat(
animView, animView,
"alpha", "alpha",
0.5f, 1.0f, 0.5f 0.5f, 1.0f
).apply { ).apply {
duration = 500 duration = 1500
} }
val scaleXAnimator = ObjectAnimator.ofFloat( val scaleXAnimator = ObjectAnimator.ofFloat(
animView, animView,
"scaleX", "scaleX",
0.5f, 1.0f, 0.5f 0.5f, 1.1f, 1F
).apply { ).apply {
duration = 500 duration = 1500
} }
val scaleYAnimator = ObjectAnimator.ofFloat( val scaleYAnimator = ObjectAnimator.ofFloat(
animView, animView,
"scaleY", "scaleY",
0.5f, 1.0f, 0.5f 0.5f, 1.1f, 1F
).apply { ).apply {
duration = 500 duration = 1500
} }
@ -70,13 +60,15 @@ class HomeDragIconView @JvmOverloads constructor(
animatorSet.playTogether(alphaAnimator, scaleXAnimator, scaleYAnimator) animatorSet.playTogether(alphaAnimator, scaleXAnimator, scaleYAnimator)
animatorSet.addListener(object : Animator.AnimatorListener { animatorSet.addListener(object : Animator.AnimatorListener {
override fun onAnimationCancel(animation: Animator) { override fun onAnimationCancel(animation: Animator) {
animView.isVisible = false postDelayed({
mBinding.progressBar.setProgress(0) animView.visibility = INVISIBLE
}, 1000)
} }
override fun onAnimationEnd(animation: Animator) { override fun onAnimationEnd(animation: Animator) {
animView.isVisible = false postDelayed({
mBinding.progressBar.setProgress(0) animView.visibility = INVISIBLE
}, 1000)
} }
override fun onAnimationRepeat(animation: Animator) { override fun onAnimationRepeat(animation: Animator) {
@ -84,12 +76,18 @@ class HomeDragIconView @JvmOverloads constructor(
} }
override fun onAnimationStart(animation: Animator) { override fun onAnimationStart(animation: Animator) {
animView.isVisible = true
} }
}) })
animatorSet.start() animatorSet.start()
} }
fun setProgress(progress: Long) {
mBinding.progressBar.setProgress(progress.toInt())
}
} }

View File

@ -0,0 +1,8 @@
package com.gamedog.vididin.youtubestatistic
class RewardConst {
companion object {
const val HOME_WATCH_DURATION = 5 * 1000L
const val HOME_WATCH_REWARD_NUM = 28
}
}

View File

@ -0,0 +1,119 @@
package com.gamedog.vididin.youtubestatistic
import android.os.Handler
import android.os.HandlerThread
import android.os.Looper
import com.ama.core.architecture.util.eventbus.NotifyMan
import com.gamedog.vididin.VididinEvents
class TickerTimer() {
private val mCountHandler: Handler by lazy {
Handler(Looper.getMainLooper())
}
private val mCounterRunnable by lazy {
object : Runnable {
override fun run() {
if (isRunning) {
handleNewTick()
mCountHandler.postDelayed(this, Notify_Interval_MS)
}
}
}
}
@Volatile
private var isRunning = false
companion object {
const val Notify_Interval_MS = 50L
}
init {
}
@Synchronized
fun start() {
isRunning = true
mCountHandler.postDelayed(mCounterRunnable, Notify_Interval_MS)
}
private fun handleNewTick() {
NotifyMan.instance().sendEvent(VididinEvents.Event_HOME_WATCH_Time_TICK, null)
}
fun pause() {
if (!isRunning) return
isRunning = false
}
fun release() {
isRunning = false
mCounterRunnable.let { mCountHandler.removeCallbacks(it) }
}
/*
private val mHandlerThread = HandlerThread("HomeCountTimeThread")
private val mCountHandler: Handler by lazy {
Handler(mHandlerThread.looper)
}
private val mCounterRunnable by lazy {
object : Runnable {
override fun run() {
if (isRunning) {
handleNewTick()
mCountHandler.postDelayed(this, Notify_Interval_MS)
}
}
}
}
@Volatile
private var isRunning = false
companion object {
const val HOME_WATCH_DURATION = 5 * 1000L
const val Notify_Interval_MS = 50L
}
init {
mHandlerThread.start()
}
@Synchronized
fun start() {
isRunning = true
mCountHandler.postDelayed(mCounterRunnable, Notify_Interval_MS)
}
private fun handleNewTick() {
NotifyMan.instance().sendEvent(VididinEvents.Event_HOME_WATCH_Time_TICK, null)
}
fun pause() {
if (!isRunning) return
isRunning = false
}
fun release() {
isRunning = false
mCounterRunnable.let { mCountHandler.removeCallbacks(it) }
mHandlerThread.quitSafely()
}*/
}

View File

@ -6,13 +6,13 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:paddingVertical="7dp"
tools:ignore="ResourceName"> tools:ignore="ResourceName">
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:padding="8dp"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
android:id="@+id/ll_gold_root" android:id="@+id/ll_gold_root"
@ -20,7 +20,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:gravity="center_vertical" android:gravity="center_vertical"
android:visibility="gone" android:visibility="invisible"
> >
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -50,7 +50,7 @@
app:backgroundColor="@color/progress_background" app:backgroundColor="@color/progress_background"
app:progressWidth="2dp" app:progressWidth="2dp"
app:centerIcon="@mipmap/home_envelope" app:centerIcon="@mipmap/home_envelope"
app:currentProgress="35" app:currentProgress="0"
app:maxProgress="100" app:maxProgress="100"
/> />

View File

@ -12,6 +12,7 @@
android:orientation="vertical"/> android:orientation="vertical"/>
<com.gamedog.vididin.widget.HomeDragIconView <com.gamedog.vididin.widget.HomeDragIconView
android:id="@+id/drag_icon_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="40dp" android:layout_marginTop="40dp"

View File

@ -58,7 +58,7 @@
<color name="progress_green">#FF00FF5E</color> <color name="progress_green">#FF00FF5E</color>
<color name="progress_background">#99000000</color> <color name="progress_background">#33FFFFFF</color>
<color name="gray_84">#ff938a84</color> <color name="gray_84">#ff938a84</color>