Files
yinmeng-android/app/src/main/java/com/mango/moshen/treasurefairy/HomeFairyActivity.kt
2023-02-27 18:22:58 +08:00

260 lines
10 KiB
Kotlin

package com.mango.moshen.treasurefairy
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.graphics.Path
import android.text.style.ForegroundColorSpan
import android.view.*
import android.widget.LinearLayout
import android.widget.TextView
import androidx.activity.viewModels
import androidx.core.content.ContextCompat
import androidx.core.graphics.toColorInt
import com.mango.core.UriProvider
import com.mango.core.treasurefairy.PrizeInfo
import com.mango.moshen.R
import com.mango.moshen.base.BaseViewBindingActivity
import com.mango.moshen.common.widget.dialog.DialogManager
import com.mango.moshen.databinding.TreasureFairyDialogHomeBinding
import com.mango.moshen.treasurefairy.dialog.ForestFairyDialog
import com.mango.moshen.treasurefairy.dialog.HomeMorePopupWindow
import com.mango.moshen.treasurefairy.dialog.HomePrizeDialog
import com.mango.moshen.treasurefairy.dialog.MyFairyDialog
import com.mango.moshen.treasurefairy.view.CustomDrawable
import com.mango.moshen.ui.webview.FairyDialogWebViewActivity
import com.mango.moshen.utils.SpannableBuilder
import com.netease.nim.uikit.common.util.sys.ScreenUtil
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
class HomeFairyActivity : BaseViewBindingActivity<TreasureFairyDialogHomeBinding>() {
private var selectIndex = 0
private var targetIndex: Int = -1
private val removeRunnable = Runnable { binding.llPrizeHint.removeAllViews() }
private val hintPrizeCacheList = ArrayList<PrizeInfo>()
private var disposable: Disposable? = null
private val viewModel: FairyViewModel by viewModels()
companion object {
@JvmStatic
fun start(context: Context) {
val starter = Intent(context, HomeFairyActivity::class.java)
context.startActivity(starter)
}
}
private val fairyItems by lazy {
listOf(
binding.fairyItem0, binding.fairyItem1, binding.fairyItem2, binding.fairyItem3,
binding.fairyItem4, binding.fairyItem5, binding.fairyItem6, binding.fairyItem7,
binding.fairyItem8, binding.fairyItem9, binding.fairyItem10, binding.fairyItem11
)
}
@SuppressLint("SetTextI18n")
override fun init() {
//这里的height用MATCH_PARENT状态栏会被顶上去,不知道什么鬼
window.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
ScreenUtil.screenHeight - ScreenUtil.getStatusBarHeight(this)
)
window.setGravity(Gravity.BOTTOM)
binding.fairyItem0.isSelected = true
looperHintPrize()
binding.tvKeyNum.setOnClickListener {
FairyDialogWebViewActivity.start(this, UriProvider.getFairyKey())
}
binding.ivMyFairy.setOnClickListener {
MyFairyDialog.newInstance().show(this)
}
binding.ivFairyTreasure.setOnClickListener {
ForestFairyDialog.newInstance().show(this)
}
binding.ivOpen1.setOnClickListener {
rotatePrize()
viewModel.drawFairy(1)
}
binding.ivOpen10.setOnClickListener {
rotatePrize()
viewModel.drawFairy(10)
}
binding.ivOpen100.setOnClickListener {
rotatePrize()
viewModel.drawFairy(100)
}
binding.rootView.setOnClickListener { finish() }
binding.viewBg.setOnClickListener {
//do nothing
}
binding.ivMore.setOnClickListener {
val popupWindow = HomeMorePopupWindow(context)
popupWindow.show(binding.ivMore, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)
}
binding.viewPrizeClick.setOnClickListener {
if (disposable?.isDisposed == false && targetIndex != -1) {
fairyItems[selectIndex].isSelected = false
fairyItems[targetIndex].isSelected = true
selectIndex = targetIndex
targetIndex = -1
HomePrizeDialog.newInstance().show(context)
disposable?.dispose()
}
}
viewModel.prizeInfoListLiveData.observe(this) {
it?.forEachIndexed { index, prizeInfo ->
if (index < fairyItems.size) {
fairyItems[index].setPrizeInfo(prizeInfo)
}
}
}
viewModel.resultLiveData.observe(this) { event ->
event?.getContentIfNotHandled()?.let {
targetIndex = viewModel.prizeInfoListLiveData.value
?.indexOfFirst { prize ->
it[0].itemIndex == prize.itemIndex
} ?: -2
if (targetIndex == -2) {
viewModel.initPrizeInfoList()
}
hintPrizeCacheList.addAll(it.filter { prizeInfo -> prizeInfo.rewardLevel >= 3 })
} ?: run {
targetIndex = -1
disposable?.dispose()
}
}
viewModel.drawInfoLiveData.observe(this) {
it?.let {
binding.tvKeyNum.text = it.drawTicketNum.toString()
binding.tvCurrentLuckyValue.text = it.luckyNum.toString()
binding.tvShortLuckyValue.text =
SpannableBuilder()
.append("达到 ", ForegroundColorSpan("#59FDFF".toColorInt()))
.append("${it.needLuckyNum}", ForegroundColorSpan("#FFE8AA".toColorInt()))
.append(" 后下次夺宝,额外获赠精灵球", ForegroundColorSpan("#59FDFF".toColorInt()))
.build()
binding.ivLuckyStone.post {
val drawable =
CustomDrawable(
ContextCompat.getDrawable(
this,
R.drawable.treasure_fairy_ic_lucky_stone
)!!
)
val path = Path()
path.addRect(
0f,
0f,
binding.ivLuckyStone.width.toFloat(),
binding.ivLuckyStone.height *
(1 - it.luckyNum / it.needLuckyNum.toFloat().coerceAtLeast(1f)),
Path.Direction.CW
)
drawable.setSrcPath(path)
binding.ivLuckyStone.setImageDrawable(drawable)
}
}
}
viewModel.showGetKeyLiveData.observe(this) {
it.getContentIfNotHandled()?.let {
DialogManager(context).showOkCancelDialog("购买限时装扮活动夺宝券", "去参与", "取消") {
FairyDialogWebViewActivity.start(context, UriProvider.getFairyKey())
}
}
}
}
override fun onResume() {
super.onResume()
viewModel.initDrawInfo()
}
private fun rotatePrize() {
enabledOpenBtn(false)
targetIndex = -1
var minCount = 0
disposable?.dispose()
disposable = Observable.interval(70, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.compose(bindToLifecycle())
.doOnNext {
fairyItems[selectIndex].isSelected = false
selectIndex++
minCount++
if (selectIndex == fairyItems.size) selectIndex = 0
if (targetIndex != -2) {
fairyItems[selectIndex].isSelected = true
}
if ((selectIndex == targetIndex || targetIndex == -2) && minCount >= 24) {
HomePrizeDialog.newInstance().show(context)
disposable?.dispose()
}
}
.doFinally { enabledOpenBtn(true) }
.subscribe()
}
private fun enabledOpenBtn(enable: Boolean) {
binding.ivOpen1.isEnabled = enable
binding.ivOpen10.isEnabled = enable
binding.ivOpen100.isEnabled = enable
}
@SuppressLint("CheckResult")
private fun looperHintPrize() {
Observable.interval(0, 250, TimeUnit.MILLISECONDS)
.compose(bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.filter { hintPrizeCacheList.size > 0 }
.subscribe(
{
addPrizeHintView(hintPrizeCacheList.removeAt(0))
}) { looperHintPrize() } //出错了继续looper......
}
private fun addPrizeHintView(prizeInfo: PrizeInfo) {
binding.llPrizeHint.removeCallbacks(removeRunnable)
binding.llPrizeHint.postDelayed(removeRunnable, 3000)
val linearLayout =
LayoutInflater.from(context)
.inflate(R.layout.item_fairy_prize_hint, null) as LinearLayout
val layoutParams =
LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ScreenUtil.dip2px(25f))
layoutParams.setMargins(0, 0, 0, ScreenUtil.dip2px(5f))
linearLayout.layoutParams = layoutParams
linearLayout.setBackgroundResource(R.drawable.treasure_fairy_bg_big_prize)
linearLayout.setPadding(ScreenUtil.dip2px(10f), 0, ScreenUtil.dip2px(10f), 0)
binding.llPrizeHint.addView(linearLayout)
if (binding.llPrizeHint.childCount > 6) {
binding.llPrizeHint.removeViewAt(0)
}
for (i in 0 until binding.llPrizeHint.childCount) {
ObjectAnimator.ofFloat(
binding.llPrizeHint.getChildAt(i),
"translationY",
ScreenUtil.dip2px(25f).toFloat(),
0f
)
.setDuration(200)
.start()
}
(linearLayout.findViewById<View>(R.id.tv_prize_name) as TextView).text =
prizeInfo.rewardName
(linearLayout.findViewById<View>(R.id.tv_prize_num) as TextView).text =
"x" + prizeInfo.rewardNum
}
}