homefragment签到模块接入正式的bean

This commit is contained in:
renhaoting 2025-11-27 11:06:31 +08:00
parent d24c51ff22
commit 6ad0ae0d22
3 changed files with 38 additions and 86 deletions

View File

@ -1,13 +0,0 @@
package com.gamedog.vididin.main.fragments.task
// DayStatus.kt
data class DayStatus(
val day: Int, // 第几天 (1-7)
val reward: String, // 奖励数值 ("100", "300"等)
val isCompleted: Boolean = false, // 是否已完成
val isPastDay: Boolean = false,
val isToday: Boolean = false, // 是否是今天
val icon: String = if (isCompleted) "" else "G" // 图标
) {
val displayText: String get() = "Dia $day"
}

View File

@ -9,7 +9,10 @@ import com.ama.core.common.util.sp
import com.gamedog.vididin.R import com.gamedog.vididin.R
import android.graphics.* import android.graphics.*
import com.ama.core.architecture.BaseApp import com.ama.core.architecture.BaseApp
import java.util.* import com.ama.core.architecture.util.ResUtil
import com.gamedog.vididin.manager.DailySignDayInfoBean
import com.gamedog.vididin.manager.TaskManager
class WeekStatusView @JvmOverloads constructor( class WeekStatusView @JvmOverloads constructor(
context: Context, context: Context,
@ -17,14 +20,12 @@ class WeekStatusView @JvmOverloads constructor(
defStyleAttr: Int = 0 defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) { ) : View(context, attrs, defStyleAttr) {
private var currentDay = 1
private var dayStatusList: List<DayStatus> = emptyList()
private var completedColor = Color.parseColor("#4CAF50") private var completedColor = Color.parseColor("#4CAF50")
private var pendingColor = Color.parseColor("#FF9800") private var pendingColor = Color.parseColor("#FF9800")
private var dayColor = Color.parseColor("#FF999999") private var dayColor = Color.parseColor("#FF999999")
private var dayPastColor = Color.parseColor("#FFD4D4D4") private var dayPastColor = Color.parseColor("#FFD4D4D4")
private var rewardTextColor = Color.parseColor("#FF9800") private var rewardTextColor = Color.parseColor("#FF9800")
private var rewardTextSignedColor = Color.parseColor("#999999")
private var todayHighlightColor = Color.parseColor("#4CAF50") private var todayHighlightColor = Color.parseColor("#4CAF50")
private var bgRectColor = Color.parseColor("#ffffedd7") private var bgRectColor = Color.parseColor("#ffffedd7")
@ -59,7 +60,7 @@ class WeekStatusView @JvmOverloads constructor(
init { init {
setupAttributes(attrs) setupAttributes(attrs)
setupDefaultData() initLoadDatas()
} }
private fun setupAttributes(attrs: AttributeSet?) { private fun setupAttributes(attrs: AttributeSet?) {
@ -80,9 +81,8 @@ class WeekStatusView @JvmOverloads constructor(
typedArray.recycle() typedArray.recycle()
} }
private fun setupDefaultData() { private fun initLoadDatas() {
currentDay = getCurrentDayOfWeek()
dayStatusList = generateWeekData(currentDay)
} }
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
@ -97,10 +97,12 @@ class WeekStatusView @JvmOverloads constructor(
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
super.onDraw(canvas) super.onDraw(canvas)
if (dayStatusList.isEmpty()) return
val dayStateList = TaskManager.instance().getDayStateList()
if (dayStateList.isEmpty()) return
val totalWidth = measuredWidth.toFloat() val totalWidth = measuredWidth.toFloat()
val totalItemCount = dayStatusList.size val totalItemCount = dayStateList.size
val itemHoriGapPixel = (totalWidth - 2 * circleRadius - 2 * HoriMagin) / (totalItemCount - 1) val itemHoriGapPixel = (totalWidth - 2 * circleRadius - 2 * HoriMagin) / (totalItemCount - 1)
// bg rect // bg rect
@ -108,27 +110,27 @@ class WeekStatusView @JvmOverloads constructor(
canvas.drawRect(circleRadius + HoriMagin, bgTop, canvas.drawRect(circleRadius + HoriMagin, bgTop,
totalWidth - circleRadius - HoriMagin, bgTop + bgRectHeight, bgPaint) totalWidth - circleRadius - HoriMagin, bgTop + bgRectHeight, bgPaint)
dayStatusList.forEachIndexed { index, dayStatus -> dayStateList.forEachIndexed { index, dayStatus ->
val centerX = HoriMagin + circleRadius + itemHoriGapPixel * index val centerX = HoriMagin + circleRadius + itemHoriGapPixel * index
drawDayStatusItem(canvas, dayStatus, centerX)
}
}
private fun drawDayStatusItem(canvas: Canvas, dayStatus: DayStatus, centerX: Float) {
// day text 'dia' // day text 'dia'
textPaint.color = if (dayStatus.isCompleted) dayPastColor else dayColor textPaint.color = if (dayStatus.hasSigned) dayPastColor else dayColor
textPaint.textSize = dayTextSize textPaint.textSize = dayTextSize
canvas.drawText(dayStatus.displayText, centerX, vertiMagin + dayTextSize/2, textPaint) canvas.drawText(ResUtil.getString(R.string.day) + " $index", centerX, vertiMagin + dayTextSize/2, textPaint)
// icons // icons
val iconRes = if (dayStatus.isCompleted) R.mipmap.task_week_view_done else R.mipmap.task_week_view_ongoing val iconRes = if (dayStatus.hasSigned) R.mipmap.task_week_view_done else R.mipmap.task_week_view_ongoing
canvas.drawBitmap(getBitmap(iconRes)!!, centerX - circleRadius, vertiMagin + dayTextSize + componentGap, circlePaint) canvas.drawBitmap(getBitmap(iconRes)!!, centerX - circleRadius, vertiMagin + dayTextSize + componentGap, circlePaint)
// reward text // reward text
textPaint.color = rewardTextColor
textPaint.textSize = rewardTextSize textPaint.textSize = rewardTextSize
canvas.drawText(dayStatus.reward, centerX, vertiMagin + dayTextSize + componentGap + 2*circleRadius + componentGap, textPaint) val rewardNum = TaskManager.instance().getRewardNumOfDailySign(index)
textPaint.color = if (dayStatus.hasSigned) rewardTextColor else rewardTextSignedColor
canvas.drawText(rewardNum.toString(), centerX, vertiMagin + dayTextSize + componentGap + 2*circleRadius + componentGap, textPaint)
} }
}
fun getBitmap(resId: Int): Bitmap? { fun getBitmap(resId: Int): Bitmap? {
return try { return try {
@ -141,52 +143,5 @@ class WeekStatusView @JvmOverloads constructor(
// --------------------- public ---------------------
fun updateData(data: List<DayStatus>) {
dayStatusList = data
invalidate()
}
fun updateForDate(targetDate: Date) {
val targetDay = getDayOfWeekFromDate(targetDate)
dayStatusList = generateWeekData(targetDay)
invalidate()
}
fun refreshToCurrentDate() {
updateForDate(Date())
}
fun getCurrentData(): List<DayStatus> = dayStatusList
fun getCurrentDay(): Int = currentDay
private fun generateWeekData(targetDay: Int): List<DayStatus> {
val rewards = listOf("100", "300", "300", "500", "300", "300", "800")
return (1..7).map { day ->
DayStatus(
day = day,
reward = rewards[day - 1],
isCompleted = day < targetDay,
isToday = day == targetDay
)
}
}
private fun getCurrentDayOfWeek(): Int {
val calendar = Calendar.getInstance()
return convertCalendarDayToWeekDay(calendar.get(Calendar.DAY_OF_WEEK))
}
private fun getDayOfWeekFromDate(date: Date): Int {
val calendar = Calendar.getInstance().apply { time = date }
return convertCalendarDayToWeekDay(calendar.get(Calendar.DAY_OF_WEEK))
}
private fun convertCalendarDayToWeekDay(calendarDay: Int): Int {
return if (calendarDay == 1) 7 else calendarDay - 1
}
} }

View File

@ -239,6 +239,16 @@ class TaskManager private constructor() {
return -1; return -1;
} }
fun getDayStateList(): List<DailySignDayInfoBean> {
return mDailySignData.signStateList
}
fun getRewardNumOfDailySign(dayIndex: Int) : Int {
return getDailyCheckInTask()?.reward_details?.get(dayIndex)?.value ?: 0
}
} }