夺宝精灵:主页&精灵密藏 UI调整

This commit is contained in:
huangjian
2023-02-22 18:05:27 +08:00
parent a644205935
commit f000f75cd4
28 changed files with 457 additions and 64 deletions

View File

@@ -52,8 +52,14 @@ public class RoomPlayDialog extends BottomSheetDialog {
private void init() { private void init() {
binding.llRadish.setVisibility(GoldBoxHelper.isShowRadish() ? View.VISIBLE : View.GONE); binding.llRadish.setVisibility(GoldBoxHelper.isShowRadish() ? View.VISIBLE : View.GONE);
binding.llRadish.setOnClickListener(v -> PullRadishActivity.start(context)); binding.llRadish.setOnClickListener(v -> {
binding.llFairy.setOnClickListener(v -> HomeFairyActivity.start(context)); PullRadishActivity.start(context);
dismiss();
});
binding.llFairy.setOnClickListener(v -> {
HomeFairyActivity.start(context);
dismiss();
});
} }
} }

View File

@@ -56,7 +56,7 @@ class FairyViewModel : BaseViewModel() {
) )
} }
private fun initPrizeInfoList() { fun initPrizeInfoList() {
safeLaunch( safeLaunch(
onError = { onError = {
_prizeInfoListLiveData.value = null _prizeInfoListLiveData.value = null
@@ -94,6 +94,7 @@ class FairyViewModel : BaseViewModel() {
block = { block = {
val result = TreasureFairyModel.drawForestFairy(drawNum, poolLevel) val result = TreasureFairyModel.drawForestFairy(drawNum, poolLevel)
_drawForestLiveData.value = result?.let { Event(it) } _drawForestLiveData.value = result?.let { Event(it) }
_forestInfoLiveData.value = TreasureFairyModel.getForestInfo()
} }
) )
} }

View File

@@ -4,11 +4,14 @@ import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.view.Gravity import android.view.Gravity
import android.view.WindowManager import android.view.WindowManager
import androidx.core.view.isInvisible
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import com.mango.core.utils.subAndReplaceDot
import com.mango.moshen.R import com.mango.moshen.R
import com.mango.moshen.base.BaseDialog import com.mango.moshen.base.BaseDialog
import com.mango.moshen.databinding.TreasureFairyDialogForestBinding import com.mango.moshen.databinding.TreasureFairyDialogForestBinding
import com.mango.moshen.ui.utils.loadAvatar
class ForestFairyDialog : BaseDialog<TreasureFairyDialogForestBinding>() { class ForestFairyDialog : BaseDialog<TreasureFairyDialogForestBinding>() {
@@ -33,10 +36,15 @@ class ForestFairyDialog : BaseDialog<TreasureFairyDialogForestBinding>() {
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
override fun init() { override fun init() {
binding.ivBack.setOnClickListener {
dismissAllowingStateLoss()
}
binding.ivRecord.setOnClickListener { binding.ivRecord.setOnClickListener {
ForestRecordDialog.newInstance().show(context) ForestRecordDialog.newInstance().show(context)
} }
binding.ivMyFairy.setOnClickListener {
MyFairyDialog.newInstance().show(context)
}
binding.ivPrevious.setOnClickListener { binding.ivPrevious.setOnClickListener {
currentType-- currentType--
@@ -47,41 +55,61 @@ class ForestFairyDialog : BaseDialog<TreasureFairyDialogForestBinding>() {
switchType() switchType()
} }
binding.viewBgGrab1.setOnClickListener { binding.viewBgGrab1.setOnClickListener {
enabledOpenBtn(false)
viewModel.drawForestFairy(1, currentType) viewModel.drawForestFairy(1, currentType)
} }
binding.viewBgGrab10.setOnClickListener { binding.viewBgGrab10.setOnClickListener {
enabledOpenBtn(false)
viewModel.drawForestFairy(10, currentType) viewModel.drawForestFairy(10, currentType)
} }
viewModel.drawForestLiveData.observe(viewLifecycleOwner) { viewModel.drawForestLiveData.observe(viewLifecycleOwner) {
enabledOpenBtn(true)
it?.getContentIfNotHandled()?.let { it?.getContentIfNotHandled()?.let {
ForestPrizeDialog.newInstance().show(context) ForestPrizeDialog.newInstance().show(context)
} }
} }
viewModel.getForestInfo()
viewModel.forestInfoLiveData.observe(viewLifecycleOwner) {
it?.let {
binding.ivAvatar.loadAvatar(it.avatar)
binding.tvNickname.text = it.nick.subAndReplaceDot(7)
binding.tvKeyNumBase.text = it.lowBallNum
binding.tvKeyNumEpic.text = it.middleBallNum
binding.tvKeyNumLegend.text = it.highBallNum
}
}
}
private fun enabledOpenBtn(enable: Boolean) {
binding.viewBgGrab1.isEnabled = enable
binding.viewBgGrab10.isEnabled = enable
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun switchType() { private fun switchType() {
when (currentType) { when (currentType) {
BASE -> { BASE -> {
binding.ivPrevious.isVisible = false binding.ivPrevious.isInvisible = true
binding.tvGrabText1.text = "(初级球X1)" binding.tvGrabText1.text = "(初级球X1)"
binding.tvGrabText10.text = "(初级球X10)" binding.tvGrabText10.text = "(初级球X10)"
binding.tvTips.text = "使用初级球有一定几率抓到初级精灵" binding.tvTips.text = "使用初级球有一定几率抓到初级精灵"
binding.viewBgForestBase.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_base) binding.viewBgForestBase.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_base)
} }
EPIC -> { EPIC -> {
binding.ivNext.isVisible = true binding.ivNext.isInvisible = false
binding.ivNext.isVisible = true binding.ivPrevious.isInvisible = false
binding.tvGrabText1.text = "(超级球X1)" binding.tvGrabText1.text = "(超级球X1)"
binding.tvGrabText10.text = "(超级球X10)" binding.tvGrabText10.text = "(超级球X10)"
binding.tvTips.text = "使用超级球有一定几率抓到史诗精灵" binding.tvTips.text = "使用超级球有一定几率抓到史诗精灵"
binding.viewBgForestBase.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_epic) binding.viewBgForestBase.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_epic)
} }
LEGEND -> { LEGEND -> {
binding.ivNext.isVisible = false binding.ivNext.isInvisible = true
binding.tvGrabText1.text = "(大师球X1)" binding.tvGrabText1.text = "(大师球X1)"
binding.tvGrabText10.text = "(大师球X10)" binding.tvGrabText10.text = "(大师球X10)"
binding.tvTips.text = "使用大师球必定抓到传说精灵" binding.tvTips.text = "使用大师球必定抓到传说精灵"

View File

@@ -0,0 +1,96 @@
package com.mango.moshen.treasurefairy;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import com.mango.moshen.R;
import com.mango.moshen.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
import com.mango.moshen.ui.widget.magicindicator.buildins.UIUtil;
import com.mango.moshen.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
import com.mango.moshen.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
import com.mango.moshen.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
import com.mango.moshen.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
import java.util.List;
public class ForestIndicatorAdapter extends CommonNavigatorAdapter {
private final Context mContext;
private final List<? extends CharSequence> mTitleList;
private int textSize = 15;
private float minScale = 1f;
private OnItemSelectListener mOnItemSelectListener;
public ForestIndicatorAdapter(Context context, List<? extends CharSequence> charSequences) {
this.mContext = context;
this.mTitleList = charSequences;
}
@Override
public int getCount() {
return mTitleList == null ? 0 : mTitleList.size();
}
@Override
public IPagerTitleView getTitleView(Context context, final int i) {
ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.white));
scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.white));
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
int padding = UIUtil.dip2px(context, 12);
scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
scaleTransitionPagerTitleView.setText(mTitleList.get(i));
scaleTransitionPagerTitleView.setOnClickListener(view -> {
if (mOnItemSelectListener != null) {
mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView);
}
});
return scaleTransitionPagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator indicator = new LinePagerIndicator(context);
indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
indicator.setLineHeight(UIUtil.dip2px(mContext, 4));
indicator.setRoundRadius(UIUtil.dip2px(mContext, 2));
indicator.setLineWidth(UIUtil.dip2px(mContext, 60));
indicator.setColors(Color.parseColor("#69FFEB"),Color.parseColor("#EAFF89"));
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.BOTTOM;
indicator.setLayoutParams(lp);
return indicator;
}
public int getTextSize() {
return textSize;
}
public void setTextSize(int textSize) {
this.textSize = textSize;
}
public float getMinScale() {
return minScale;
}
public void setMinScale(float minScale) {
this.minScale = minScale;
}
public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
mOnItemSelectListener = onItemSelectListener;
}
public interface OnItemSelectListener {
void onItemSelect(int position, TextView view);
}
}

View File

@@ -7,8 +7,14 @@ import com.mango.moshen.R
import com.mango.moshen.ui.utils.load import com.mango.moshen.ui.utils.load
import com.mango.core.treasurefairy.PrizeInfo import com.mango.core.treasurefairy.PrizeInfo
class ForestPrizeAdapter : class ForestPrizeAdapter(val isSingle: Boolean = false) :
BaseQuickAdapter<PrizeInfo, BaseViewHolder>(R.layout.treasure_fairy_item_forest_prize) { BaseQuickAdapter<PrizeInfo, BaseViewHolder>(
if (isSingle) {
R.layout.treasure_fairy_item_forest_prize_single
} else {
R.layout.treasure_fairy_item_forest_prize
}
) {
override fun convert(helper: BaseViewHolder, item: PrizeInfo) { override fun convert(helper: BaseViewHolder, item: PrizeInfo) {
helper.getView<ImageView>(R.id.iv_prize_icon).load(item.rewardPicUrl) helper.getView<ImageView>(R.id.iv_prize_icon).load(item.rewardPicUrl)

View File

@@ -4,10 +4,12 @@ import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.view.Gravity import android.view.Gravity
import android.view.WindowManager import android.view.WindowManager
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.mango.core.treasurefairy.PrizeInfo import com.mango.core.treasurefairy.PrizeInfo
import com.mango.moshen.R
import com.mango.moshen.base.BaseDialog import com.mango.moshen.base.BaseDialog
import com.mango.moshen.databinding.TreasureFairyDialogForestPrizeBinding import com.mango.moshen.databinding.TreasureFairyDialogForestPrizeBinding
import com.mango.moshen.ui.utils.RVDelegate import com.mango.moshen.ui.utils.RVDelegate
@@ -23,8 +25,9 @@ class ForestPrizeDialog : BaseDialog<TreasureFairyDialogForestPrizeBinding>() {
private val viewModel: FairyViewModel by activityViewModels() private val viewModel: FairyViewModel by activityViewModels()
companion object { companion object {
fun newInstance(): ForestPrizeDialog { fun newInstance(isFairy: Boolean = false): ForestPrizeDialog {
val args = Bundle() val args = Bundle()
args.putBoolean("isFairy", isFairy)
val fragment = ForestPrizeDialog() val fragment = ForestPrizeDialog()
fragment.arguments = args fragment.arguments = args
return fragment return fragment
@@ -36,16 +39,41 @@ class ForestPrizeDialog : BaseDialog<TreasureFairyDialogForestPrizeBinding>() {
binding.tvClose.setOnClickListener { binding.tvClose.setOnClickListener {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
prizeAdapter = ForestPrizeAdapter() val prizeInfoList = viewModel.drawForestLiveData.value?.peekContent()
if (prizeInfoList.isNullOrEmpty()) return
val isSingle = prizeInfoList.size == 1
val hasSurprise = prizeInfoList.find { it.propType == 1 } != null
val isFairy =
requireArguments().getBoolean("isFairy", true) || !hasSurprise
binding.tvTitle.text = if (isFairy) "获得精灵" else "意外发现"
if (!isFairy && !isSingle && hasSurprise) {
newInstance(true).show(context)
}
val showPrizeInfoList =
prizeInfoList.filter { if (isFairy) (it.propType != 1) else (it.propType == 1) }
val isShowDateSingle = showPrizeInfoList.size == 1
if (!isShowDateSingle) {
binding.viewBg.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_prize)
val layoutParams = binding.viewBg.layoutParams as ConstraintLayout.LayoutParams
layoutParams.dimensionRatio = "636:766"
layoutParams.matchConstraintPercentWidth = 0.85f
binding.viewBg.layoutParams = layoutParams
}
prizeAdapter = ForestPrizeAdapter(isShowDateSingle)
rvDelegate = RVDelegate.Builder<PrizeInfo>() rvDelegate = RVDelegate.Builder<PrizeInfo>()
.setAdapter(prizeAdapter) .setAdapter(prizeAdapter)
.setRecyclerView(binding.recyclerView) .setRecyclerView(binding.recyclerView)
.setLayoutManager(GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false)) .setLayoutManager(
if (isShowDateSingle) {
LinearLayoutManager(context)
} else {
GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false)
}
)
.build() .build()
viewModel.drawForestLiveData.observe(viewLifecycleOwner) { event -> rvDelegate.setNewData(showPrizeInfoList)
rvDelegate.setNewData(event.peekContent())
}
} }
} }

View File

@@ -42,7 +42,7 @@ class ForestPrizesFragment : BaseViewBindingFragment<TreasureFairyFragmentForest
tagList.add("传说森林") tagList.add("传说森林")
val commonNavigator = CommonNavigator(context) val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true) commonNavigator.setTitleWrapContent(true)
val magicIndicatorAdapter = UserInfoIndicatorAdapter(context, tagList) val magicIndicatorAdapter = ForestIndicatorAdapter(context, tagList)
magicIndicatorAdapter.setOnItemSelectListener { position: Int, _: TextView -> magicIndicatorAdapter.setOnItemSelectListener { position: Int, _: TextView ->
viewPager.currentItem = position viewPager.currentItem = position
} }

View File

@@ -4,12 +4,15 @@ import android.animation.ObjectAnimator
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Color
import android.graphics.Path import android.graphics.Path
import android.text.style.ForegroundColorSpan
import android.view.* import android.view.*
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.graphics.toColorInt
import com.mango.core.UriProvider import com.mango.core.UriProvider
import com.mango.core.treasurefairy.PrizeInfo import com.mango.core.treasurefairy.PrizeInfo
import com.mango.moshen.R import com.mango.moshen.R
@@ -17,7 +20,7 @@ import com.mango.moshen.base.BaseViewBindingActivity
import com.mango.moshen.common.widget.dialog.DialogManager import com.mango.moshen.common.widget.dialog.DialogManager
import com.mango.moshen.databinding.TreasureFairyDialogHomeBinding import com.mango.moshen.databinding.TreasureFairyDialogHomeBinding
import com.mango.moshen.ui.webview.FairyDialogWebViewActivity import com.mango.moshen.ui.webview.FairyDialogWebViewActivity
import com.netease.nim.uikit.common.ui.dialog.CustomPopupWindow import com.mango.moshen.utils.SpannableBuilder
import com.netease.nim.uikit.common.util.sys.ScreenUtil import com.netease.nim.uikit.common.util.sys.ScreenUtil
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.android.schedulers.AndroidSchedulers
@@ -87,16 +90,7 @@ class HomeFairyActivity : BaseViewBindingActivity<TreasureFairyDialogHomeBinding
} }
binding.ivMore.setOnClickListener { binding.ivMore.setOnClickListener {
val popupWindow = CustomPopupWindow(context, LinearLayout.VERTICAL) val popupWindow = HomeMorePopupWindow(context)
popupWindow.addItem("规则说明") {
FairyDialogWebViewActivity.start(context, UriProvider.getFairyRule())
}
popupWindow.addItem("获奖记录") {
FairyDialogWebViewActivity.start(context, UriProvider.getFairyRecord())
}
popupWindow.addItem("夺宝达人") {
FairyDialogWebViewActivity.start(context, UriProvider.getFairySuperior())
}
popupWindow.show(binding.ivMore, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL) popupWindow.show(binding.ivMore, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)
} }
@@ -113,7 +107,10 @@ class HomeFairyActivity : BaseViewBindingActivity<TreasureFairyDialogHomeBinding
viewModel.resultLiveData.observe(this) { event -> viewModel.resultLiveData.observe(this) { event ->
event?.getContentIfNotHandled()?.let { event?.getContentIfNotHandled()?.let {
targetIndex = viewModel.prizeInfoListLiveData.value?.indexOf(it[0]) ?: -1 targetIndex = viewModel.prizeInfoListLiveData.value?.indexOf(it[0]) ?: -2
if (targetIndex == -2) {
viewModel.initPrizeInfoList()
}
hintPrizeCacheList.addAll(it.filter { prizeInfo -> prizeInfo.rewardLevel >= 3 }) hintPrizeCacheList.addAll(it.filter { prizeInfo -> prizeInfo.rewardLevel >= 3 })
} ?: run { } ?: run {
targetIndex = -1 targetIndex = -1
@@ -131,7 +128,13 @@ class HomeFairyActivity : BaseViewBindingActivity<TreasureFairyDialogHomeBinding
it?.let { it?.let {
binding.tvKeyNum.text = it.drawTicketNum.toString() binding.tvKeyNum.text = it.drawTicketNum.toString()
binding.tvCurrentLuckyValue.text = it.luckyNum.toString() binding.tvCurrentLuckyValue.text = it.luckyNum.toString()
binding.tvShortLuckyValue.text = "达到${it.needLuckyNum}后下次夺宝,额外获赠精灵球"
binding.tvShortLuckyValue.text =
SpannableBuilder()
.append("达到 ", ForegroundColorSpan("#59FDFF".toColorInt()))
.append("${it.needLuckyNum}", ForegroundColorSpan("#FFE8AA".toColorInt()))
.append(" 后下次夺宝,额外获赠精灵球", ForegroundColorSpan("#59FDFF".toColorInt()))
.build()
binding.ivLuckyStone.post { binding.ivLuckyStone.post {
val drawable = CustomDrawable( val drawable = CustomDrawable(
ContextCompat.getDrawable( ContextCompat.getDrawable(
@@ -169,6 +172,7 @@ class HomeFairyActivity : BaseViewBindingActivity<TreasureFairyDialogHomeBinding
} }
private fun rotatePrize() { private fun rotatePrize() {
enabledOpenBtn(false)
targetIndex = -1 targetIndex = -1
var minCount = 0 var minCount = 0
disposable?.dispose() disposable?.dispose()
@@ -180,15 +184,24 @@ class HomeFairyActivity : BaseViewBindingActivity<TreasureFairyDialogHomeBinding
selectIndex++ selectIndex++
minCount++ minCount++
if (selectIndex == fairyItems.size) selectIndex = 0 if (selectIndex == fairyItems.size) selectIndex = 0
fairyItems[selectIndex].isSelected = true if (targetIndex != -2) {
if (selectIndex == targetIndex && minCount >= 24) { fairyItems[selectIndex].isSelected = true
}
if ((selectIndex == targetIndex || targetIndex == -2) && minCount >= 24) {
HomePrizeDialog.newInstance().show(context) HomePrizeDialog.newInstance().show(context)
disposable?.dispose() disposable?.dispose()
} }
} }
.doFinally { enabledOpenBtn(true) }
.subscribe() .subscribe()
} }
private fun enabledOpenBtn(enable: Boolean) {
binding.ivOpen1.isEnabled = enable
binding.ivOpen10.isEnabled = enable
binding.ivOpen100.isEnabled = enable
}
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
private fun looperHintPrize() { private fun looperHintPrize() {
Observable.interval(0, 250, TimeUnit.MILLISECONDS) Observable.interval(0, 250, TimeUnit.MILLISECONDS)

View File

@@ -0,0 +1,37 @@
package com.mango.moshen.treasurefairy
import android.content.Context
import android.graphics.Color
import android.view.View
import com.mango.core.UriProvider
import com.mango.moshen.R
import com.mango.moshen.ui.webview.FairyDialogWebViewActivity
import razerdp.basepopup.BasePopupWindow
class HomeMorePopupWindow(private val context: Context) : BasePopupWindow(context) {
init {
contentView = createPopupById(R.layout.treasure_fairy_popup_window_home_more)
setOutSideDismiss(true)
setBackgroundColor(Color.TRANSPARENT)
setPopupAnimationStyle(-1)
findViewById<View>(R.id.tv_rule).setOnClickListener {
FairyDialogWebViewActivity.start(context, UriProvider.getFairyRule())
dismiss()
}
findViewById<View>(R.id.tv_record).setOnClickListener {
FairyDialogWebViewActivity.start(context, UriProvider.getFairyRecord())
dismiss()
}
findViewById<View>(R.id.tv_rank).setOnClickListener {
FairyDialogWebViewActivity.start(context, UriProvider.getFairySuperior())
dismiss()
}
}
fun show(anchor: View?, popupGravity: Int) {
setPopupGravity(popupGravity)
showPopupWindow(anchor)
}
}

View File

@@ -8,8 +8,14 @@ import com.mango.moshen.ui.utils.load
import com.mango.core.room.game.GameInfo import com.mango.core.room.game.GameInfo
import com.mango.core.treasurefairy.PrizeInfo import com.mango.core.treasurefairy.PrizeInfo
class HomePrizeAdapter : class HomePrizeAdapter(val isSingle: Boolean = false) :
BaseQuickAdapter<PrizeInfo, BaseViewHolder>(R.layout.treasure_fairy_item_home_prize) { BaseQuickAdapter<PrizeInfo, BaseViewHolder>(
if (isSingle) {
R.layout.treasure_fairy_item_home_prize_single
} else {
R.layout.treasure_fairy_item_home_prize
}
) {
override fun convert(helper: BaseViewHolder, item: PrizeInfo) { override fun convert(helper: BaseViewHolder, item: PrizeInfo) {
helper.getView<ImageView>(R.id.iv_prize_icon).load(item.rewardPicUrl) helper.getView<ImageView>(R.id.iv_prize_icon).load(item.rewardPicUrl)

View File

@@ -9,6 +9,7 @@ import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.mango.core.room.game.GameInfo import com.mango.core.room.game.GameInfo
import com.mango.core.treasurefairy.PrizeInfo import com.mango.core.treasurefairy.PrizeInfo
import com.mango.moshen.R
import com.mango.moshen.base.BaseDialog import com.mango.moshen.base.BaseDialog
import com.mango.moshen.databinding.TreasureFairyDialogHomePrizeBinding import com.mango.moshen.databinding.TreasureFairyDialogHomePrizeBinding
import com.mango.moshen.ui.utils.RVDelegate import com.mango.moshen.ui.utils.RVDelegate
@@ -36,16 +37,22 @@ class HomePrizeDialog : BaseDialog<TreasureFairyDialogHomePrizeBinding>() {
binding.rootView.setOnClickListener { binding.rootView.setOnClickListener {
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
prizeAdapter = HomePrizeAdapter() val prizeInfoList = viewModel.resultLiveData.value?.peekContent()
if (prizeInfoList.isNullOrEmpty()) return
val isSingle = prizeInfoList.size == 1
prizeAdapter = HomePrizeAdapter(isSingle)
rvDelegate = RVDelegate.Builder<PrizeInfo>() rvDelegate = RVDelegate.Builder<PrizeInfo>()
.setAdapter(prizeAdapter) .setAdapter(prizeAdapter)
.setRecyclerView(binding.recyclerView) .setRecyclerView(binding.recyclerView)
.setLayoutManager(GridLayoutManager(context, 4, LinearLayoutManager.VERTICAL, false)) .setLayoutManager(
if (isSingle) {
LinearLayoutManager(context)
} else {
GridLayoutManager(context, 4, LinearLayoutManager.VERTICAL, false)
}
)
.build() .build()
rvDelegate.setNewData(prizeInfoList)
viewModel.resultLiveData.observe(viewLifecycleOwner) { event ->
rvDelegate.setNewData(event.peekContent())
}
} }
} }

View File

@@ -29,6 +29,9 @@ class MyFairyDialog : BaseDialog<TreasureFairyDialogMyFairyBinding>() {
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
override fun init() { override fun init() {
binding.ivBack.setOnClickListener {
dismissAllowingStateLoss()
}
binding.rg.setOnCheckedChangeListener { _, checkedId -> binding.rg.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) { when (checkedId) {
R.id.rb_base -> binding.viewPager.currentItem = 0 R.id.rb_base -> binding.viewPager.currentItem = 0

View File

@@ -2,8 +2,10 @@ package com.mango.moshen.ui.widget.magicindicator.buildins.commonnavigator.indic
import android.content.Context; import android.content.Context;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Shader;
import android.view.View; import android.view.View;
import android.view.animation.Interpolator; import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator; import android.view.animation.LinearInterpolator;
@@ -27,7 +29,9 @@ public class LinePagerIndicator extends View implements IPagerIndicator {
public static final int MODE_MATCH_EDGE = 0; // 直线宽度 == title宽度 - 2 * mXOffset public static final int MODE_MATCH_EDGE = 0; // 直线宽度 == title宽度 - 2 * mXOffset
public static final int MODE_WRAP_CONTENT = 1; // 直线宽度 == title内容宽度 - 2 * mXOffset public static final int MODE_WRAP_CONTENT = 1; // 直线宽度 == title内容宽度 - 2 * mXOffset
public static final int MODE_EXACTLY = 2; // 直线宽度 == mLineWidth public static final int MODE_EXACTLY = 2; // 直线宽度 == mLineWidth
private final int[] mGradientColors = {0xFF5BC8F8, 0xFF66D9D9};
//渐变位置
private final float[] mGradientPosition = new float[]{0, 1};
private int mMode; // 默认为MODE_MATCH_EDGE模式 private int mMode; // 默认为MODE_MATCH_EDGE模式
// 控制动画 // 控制动画
@@ -69,14 +73,6 @@ public class LinePagerIndicator extends View implements IPagerIndicator {
return; return;
} }
// 计算颜色
if (mColors != null && mColors.size() > 0) {
int currentColor = mColors.get(Math.abs(position) % mColors.size());
int nextColor = mColors.get(Math.abs(position + 1) % mColors.size());
int color = ArgbEvaluatorHolder.eval(positionOffset, currentColor, nextColor);
mPaint.setColor(color);
}
// 计算锚点位置 // 计算锚点位置
PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position); PositionData current = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position);
PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1); PositionData next = FragmentContainerHelper.getImitativePositionData(mPositionDataList, position + 1);
@@ -106,13 +102,23 @@ public class LinePagerIndicator extends View implements IPagerIndicator {
mLineRect.right = rightX + (nextRightX - rightX) * mEndInterpolator.getInterpolation(positionOffset); mLineRect.right = rightX + (nextRightX - rightX) * mEndInterpolator.getInterpolation(positionOffset);
mLineRect.top = getHeight() - mLineHeight - mYOffset; mLineRect.top = getHeight() - mLineHeight - mYOffset;
mLineRect.bottom = getHeight() - mYOffset; mLineRect.bottom = getHeight() - mYOffset;
// 计算颜色
if (mColors != null && mColors.size() > 0) {
if (mColors.size() == 1) {
mPaint.setColor(mColors.get(0));
} else {
mGradientColors[0] = mColors.get(0);
mGradientColors[1] = mColors.get(1);
mPaint.setShader(new LinearGradient(mLineRect.left, mLineRect.top, mLineRect.right, mLineRect.bottom, mGradientColors, mGradientPosition, Shader.TileMode.CLAMP));
}
}
invalidate(); invalidate();
} }
@Override @Override
public void onPageSelected(int position) { public void onPageSelected(int position) {
onPageScrolled(position,0,0); onPageScrolled(position, 0, 0);
} }
@Override @Override

Binary file not shown.

Before

Width:  |  Height:  |  Size: 203 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -27,6 +27,16 @@
app:layout_constraintTop_toTopOf="@id/view_bg" app:layout_constraintTop_toTopOf="@id/view_bg"
app:layout_constraintWidth_percent="0.408" /> app:layout_constraintWidth_percent="0.408" />
<ImageView
android:id="@+id/iv_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="42dp"
android:src="@drawable/treasure_fairy_ic_back"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/view_bg" />
<ImageView <ImageView
android:id="@+id/iv_my_fairy" android:id="@+id/iv_my_fairy"
android:layout_width="50dp" android:layout_width="50dp"
@@ -97,6 +107,7 @@
android:layout_height="42dp" android:layout_height="42dp"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"
android:src="@drawable/treasure_fairy_ic_forest_next" android:src="@drawable/treasure_fairy_ic_forest_next"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="@id/view_bg_forest_base" app:layout_constraintBottom_toBottomOf="@id/view_bg_forest_base"
app:layout_constraintStart_toStartOf="@id/view_bg_forest_base" app:layout_constraintStart_toStartOf="@id/view_bg_forest_base"
app:layout_constraintTop_toTopOf="@id/view_bg_forest_base" app:layout_constraintTop_toTopOf="@id/view_bg_forest_base"
@@ -240,10 +251,11 @@
android:src="@drawable/default_cover" /> android:src="@drawable/default_cover" />
<TextView <TextView
android:id="@+id/tv_key_num_base"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="3dp" android:layout_marginStart="3dp"
android:text="1000" android:text="0"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="13sp" /> android:textSize="13sp" />
@@ -254,10 +266,11 @@
android:src="@drawable/default_cover" /> android:src="@drawable/default_cover" />
<TextView <TextView
android:id="@+id/tv_key_num_epic"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="3dp" android:layout_marginStart="3dp"
android:text="1000" android:text="0"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="13sp" /> android:textSize="13sp" />
@@ -268,10 +281,11 @@
android:src="@drawable/default_cover" /> android:src="@drawable/default_cover" />
<TextView <TextView
android:id="@+id/tv_key_num_legend"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="3dp" android:layout_marginStart="3dp"
android:text="1000" android:text="0"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="13sp" /> android:textSize="13sp" />

View File

@@ -10,7 +10,7 @@
android:id="@+id/view_bg" android:id="@+id/view_bg"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:background="@drawable/treasure_fairy_bg_forest_prize" android:background="@drawable/treasure_fairy_bg_forest_prize_single"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="562:570" app:layout_constraintDimensionRatio="562:570"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
@@ -40,7 +40,7 @@
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginEnd="20dp" android:layout_marginEnd="20dp"
android:layout_marginBottom="18dp" android:layout_marginBottom="18dp"
app:layout_constraintBottom_toTopOf="@id/iv_close" app:layout_constraintBottom_toTopOf="@id/tv_close"
app:layout_constraintEnd_toEndOf="@id/view_bg" app:layout_constraintEnd_toEndOf="@id/view_bg"
app:layout_constraintStart_toStartOf="@id/view_bg" app:layout_constraintStart_toStartOf="@id/view_bg"
app:layout_constraintTop_toBottomOf="@id/tv_title" /> app:layout_constraintTop_toBottomOf="@id/tv_title" />

View File

@@ -12,7 +12,7 @@
android:layout_height="0dp" android:layout_height="0dp"
android:background="@drawable/treasure_fairy_bg_forest_record" android:background="@drawable/treasure_fairy_bg_forest_record"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="562:570" app:layout_constraintDimensionRatio="631:772"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
@@ -58,6 +58,10 @@
android:id="@+id/view_pager" android:id="@+id/view_pager"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginTop="24dp"
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:layout_marginBottom="30dp"
app:layout_constraintBottom_toBottomOf="@id/view_bg" app:layout_constraintBottom_toBottomOf="@id/view_bg"
app:layout_constraintEnd_toEndOf="@id/view_bg" app:layout_constraintEnd_toEndOf="@id/view_bg"
app:layout_constraintStart_toStartOf="@id/view_bg" app:layout_constraintStart_toStartOf="@id/view_bg"

View File

@@ -16,6 +16,16 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/iv_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="42dp"
android:src="@drawable/treasure_fairy_ic_back"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/view_bg" />
<ImageView <ImageView
android:id="@+id/iv_title" android:id="@+id/iv_title"
android:layout_width="0dp" android:layout_width="0dp"

View File

@@ -9,7 +9,7 @@
<com.mango.moshen.ui.widget.magicindicator.MagicIndicator <com.mango.moshen.ui.widget.magicindicator.MagicIndicator
android:id="@+id/magic_indicator" android:id="@+id/magic_indicator"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="20dp" android:layout_height="25dp"
android:layout_gravity="center_horizontal" android:layout_gravity="center_horizontal"
/> />

View File

@@ -40,8 +40,8 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
android:layout_marginBottom="20dp" />
</LinearLayout> </LinearLayout>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<com.mango.moshen.common.widget.CircleImageView
android:id="@+id/iv_prize_icon"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_gravity="center"
android:scaleType="centerCrop"
android:src="@drawable/default_cover"
app:cborder_color="#F4FFC3"
app:cborder_width="1px" />
<TextView
android:id="@+id/tv_prize_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:ellipsize="end"
android:gravity="center"
android:includeFontPadding="false"
android:maxLines="1"
android:text="精灵球"
android:textColor="@color/white"
android:textSize="12sp" />
</LinearLayout>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:gravity="center"
android:orientation="vertical">
<FrameLayout
android:layout_width="90dp"
android:layout_height="90dp"
android:background="@drawable/treasure_fairy_bg_item_home_prize">
<ImageView
android:id="@+id/iv_prize_icon"
android:layout_width="72dp"
android:layout_height="72dp"
android:layout_gravity="center"
android:scaleType="centerCrop"
android:src="@drawable/default_cover" />
<TextView
android:id="@+id/tv_prize_num"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="end|bottom"
android:background="@drawable/treasure_fairy_bg_home_prize_number"
android:gravity="center"
android:paddingTop="3dp"
android:text="X10"
android:textColor="#ff1f5764"
android:textSize="10sp" />
</FrameLayout>
<TextView
android:id="@+id/tv_prize_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:ellipsize="end"
android:gravity="center"
android:includeFontPadding="false"
android:maxLines="1"
android:text="精灵球"
android:textColor="#FFE8AA"
android:textSize="13sp" />
</LinearLayout>

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="111dp"
android:layout_height="131dp"
android:background="@drawable/treasure_fairy_bg_home_popup_window"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tv_rule"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginTop="22dp"
android:gravity="center"
android:text="规则说明"
android:textColor="@color/white"
android:textSize="13sp" />
<TextView
android:id="@+id/tv_record"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:gravity="center"
android:text="奖励记录"
android:textColor="@color/white"
android:textSize="13sp" />
<TextView
android:id="@+id/tv_rank"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:gravity="center"
android:text="夺宝达人"
android:textColor="@color/white"
android:textSize="13sp" />
</LinearLayout>

View File

@@ -3,9 +3,9 @@ package com.mango.core.treasurefairy
data class ForestInfo( data class ForestInfo(
val avatar: String = "", val avatar: String = "",
val erbanNo: Int = 0, val erbanNo: Int = 0,
val highBallNum: Int = 0, val highBallNum: String = "0",
val lowBallNum: Int = 0, val lowBallNum: String = "0",
val middleBallNum: Int = 0, val middleBallNum: String = "0",
val nick: String = "", val nick: String = "",
val uid: Int = 0 val uid: Int = 0
) )

View File

@@ -10,7 +10,8 @@ data class PrizeInfo(
val rewardType: String = "", val rewardType: String = "",
val rewardUnit: String = "", val rewardUnit: String = "",
val drawTime: Long = 0, val drawTime: Long = 0,
val poolLevel: Int = 0 val poolLevel: Int = 0,
val propType: Int? = null
) { ) {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true