260 lines
10 KiB
Kotlin
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
|
|
}
|
|
|
|
} |