From d4a5b60a6d8503d2ec2cf84890038d3248d7da89 Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Wed, 19 Nov 2025 17:58:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=A8=E7=AD=BE=E5=88=B0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=20View?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vididin/main/fragments/task/DayStatus.kt | 1 + .../main/fragments/task/WeekStatusView.kt | 130 +++++++----------- ...inapp_feature_message_fragment_message.xml | 14 +- .../mipmap-xxhdpi/task_week_view_done.webp | Bin 0 -> 9522 bytes .../mipmap-xxhdpi/task_week_view_ongoing.webp | Bin 0 -> 9656 bytes 5 files changed, 53 insertions(+), 92 deletions(-) create mode 100644 app/src/main/res/mipmap-xxhdpi/task_week_view_done.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/task_week_view_ongoing.webp diff --git a/app/src/main/java/com/gamedog/vididin/main/fragments/task/DayStatus.kt b/app/src/main/java/com/gamedog/vididin/main/fragments/task/DayStatus.kt index 5b5074a..59a4fd3 100644 --- a/app/src/main/java/com/gamedog/vididin/main/fragments/task/DayStatus.kt +++ b/app/src/main/java/com/gamedog/vididin/main/fragments/task/DayStatus.kt @@ -5,6 +5,7 @@ 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" // 图标 ) { diff --git a/app/src/main/java/com/gamedog/vididin/main/fragments/task/WeekStatusView.kt b/app/src/main/java/com/gamedog/vididin/main/fragments/task/WeekStatusView.kt index ffa3ebf..d0e85bf 100644 --- a/app/src/main/java/com/gamedog/vididin/main/fragments/task/WeekStatusView.kt +++ b/app/src/main/java/com/gamedog/vididin/main/fragments/task/WeekStatusView.kt @@ -8,6 +8,7 @@ import com.ama.core.common.util.dp import com.ama.core.common.util.sp import com.gamedog.vididin.R import android.graphics.* +import com.ama.core.architecture.BaseApp import java.util.* class WeekStatusView @JvmOverloads constructor( @@ -16,22 +17,24 @@ class WeekStatusView @JvmOverloads constructor( defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr) { - // 默认颜色配置(匹配图片样式) - private var completedColor = Color.parseColor("#4CAF50") // 已完成绿色 - private var pendingColor = Color.parseColor("#FF9800") // 未完成橙色 - private var textColor = Color.parseColor("#757575") // 文字灰色 - private var rewardTextColor = Color.parseColor("#FF9800") // 奖励数值橙色 - private var todayHighlightColor = Color.parseColor("#4CAF50") // 今天高亮边框颜色 + private var currentDay = 1 + private var dayStatusList: List = emptyList() + private var completedColor = Color.parseColor("#4CAF50") + private var pendingColor = Color.parseColor("#FF9800") + private var dayColor = Color.parseColor("#FF999999") + private var dayPastColor = Color.parseColor("#FFD4D4D4") + private var rewardTextColor = Color.parseColor("#FF9800") + private var todayHighlightColor = Color.parseColor("#4CAF50") private var bgRectColor = Color.parseColor("#ffffedd7") - - // 默认尺寸配置 - private var circleRadius = 40f.dp.toFloat() - private var textSize = 12f.sp.toFloat() + private var circleRadius = 46.5F + private var dayTextSize = 12f.sp.toFloat() private var rewardTextSize = 14f.sp.toFloat() - private var itemSpacing = 16f.dp.toFloat() + private var HoriMagin = 5F.dp.toFloat() + private var vertiMagin = 5F.dp.toFloat() + private var componentGap = 15F.dp.toFloat() private var todayStrokeWidth = 3f.dp.toFloat() private var bgRectHeight = 10.dp.toFloat() @@ -49,16 +52,10 @@ class WeekStatusView @JvmOverloads constructor( isAntiAlias = true textAlign = Paint.Align.CENTER } - private val todayHighlightPaint = Paint().apply { - isAntiAlias = true - style = Paint.Style.STROKE - color = todayHighlightColor - strokeWidth = todayStrokeWidth.toFloat() - } - // 数据 - private var dayStatusList: List = emptyList() - private var currentDay = 1 + + + init { setupAttributes(attrs) @@ -70,19 +67,16 @@ class WeekStatusView @JvmOverloads constructor( completedColor = typedArray.getColor(R.styleable.WeekStatusView_completedColor, completedColor) pendingColor = typedArray.getColor(R.styleable.WeekStatusView_pendingColor, pendingColor) - textColor = typedArray.getColor(R.styleable.WeekStatusView_textColor, textColor) + dayColor = typedArray.getColor(R.styleable.WeekStatusView_textColor, dayColor) rewardTextColor = typedArray.getColor(R.styleable.WeekStatusView_rewardTextColor, rewardTextColor) todayHighlightColor = typedArray.getColor(R.styleable.WeekStatusView_todayHighlightColor, todayHighlightColor) circleRadius = typedArray.getDimension(R.styleable.WeekStatusView_circleRadius, circleRadius) - textSize = typedArray.getDimension(R.styleable.WeekStatusView_textSize, textSize) + dayTextSize = typedArray.getDimension(R.styleable.WeekStatusView_textSize, dayTextSize) rewardTextSize = typedArray.getDimension(R.styleable.WeekStatusView_rewardTextSize, rewardTextSize) - itemSpacing = typedArray.getDimension(R.styleable.WeekStatusView_itemSpacing, itemSpacing) + vertiMagin = typedArray.getDimension(R.styleable.WeekStatusView_itemSpacing, vertiMagin) todayStrokeWidth = typedArray.getDimension(R.styleable.WeekStatusView_todayStrokeWidth, todayStrokeWidth) - todayHighlightPaint.strokeWidth = todayStrokeWidth - todayHighlightPaint.color = todayHighlightColor - typedArray.recycle() } @@ -93,7 +87,7 @@ class WeekStatusView @JvmOverloads constructor( override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { val desiredWidth = MeasureSpec.getSize(widthMeasureSpec) - val desiredHeight = (circleRadius * 2 + textSize * 3 + itemSpacing * 2).toInt() + val desiredHeight = (circleRadius * 2 + dayTextSize + rewardTextSize + vertiMagin * 2 + 2*componentGap).toInt() setMeasuredDimension( resolveSize(desiredWidth, widthMeasureSpec), @@ -103,95 +97,71 @@ class WeekStatusView @JvmOverloads constructor( override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - if (dayStatusList.isEmpty()) return val totalWidth = measuredWidth.toFloat() - val totalHeight = measuredHeight.toFloat() - val totalItems = dayStatusList.size - val availableWidth = totalWidth - (itemSpacing * (totalItems - 1)) - val itemWidth = availableWidth / totalItems + val totalItemCount = dayStatusList.size + val itemHoriGapPixel = (totalWidth - 2 * circleRadius - 2 * HoriMagin) / (totalItemCount - 1) - // bg - canvas.drawRect(itemWidth/2, (totalHeight - bgRectHeight)/2, totalWidth - itemWidth/2, totalHeight - (totalHeight - bgRectHeight)/2, bgPaint) + // bg rect + val bgTop = vertiMagin + dayTextSize + componentGap + (circleRadius - bgRectHeight/2) + canvas.drawRect(circleRadius + HoriMagin, bgTop, + totalWidth - circleRadius - HoriMagin, bgTop + bgRectHeight, bgPaint) dayStatusList.forEachIndexed { index, dayStatus -> - val centerX = itemWidth / 2 + index * (itemWidth + itemSpacing) - drawDayStatus(canvas, dayStatus, centerX) + val centerX = HoriMagin + circleRadius + itemHoriGapPixel * index + drawDayStatusItem(canvas, dayStatus, centerX) } } - private fun drawDayStatus(canvas: Canvas, dayStatus: DayStatus, centerX: Float) { - val centerY = height / 2f - val circleCenterY = centerY - circleRadius + private fun drawDayStatusItem(canvas: Canvas, dayStatus: DayStatus, centerX: Float) { + // day text 'dia' + textPaint.color = if (dayStatus.isCompleted) dayPastColor else dayColor + textPaint.textSize = dayTextSize + canvas.drawText(dayStatus.displayText, centerX, vertiMagin + dayTextSize/2, textPaint) - // 绘制圆形背景 - circlePaint.color = if (dayStatus.isCompleted) completedColor else pendingColor - canvas.drawCircle(centerX, circleCenterY, circleRadius, circlePaint) + // icons + val iconRes = if (dayStatus.isCompleted) R.mipmap.task_week_view_done else R.mipmap.task_week_view_ongoing + canvas.drawBitmap(getBitmap(iconRes)!!, centerX - circleRadius, vertiMagin + dayTextSize + componentGap, circlePaint) - // 绘制图标(对勾或G) - textPaint.color = Color.WHITE - textPaint.textSize = circleRadius * 0.6f - val iconBounds = Rect() - textPaint.getTextBounds(dayStatus.icon, 0, dayStatus.icon.length, iconBounds) - val iconY = circleCenterY + (iconBounds.height() / 2) - iconBounds.bottom - canvas.drawText(dayStatus.icon, centerX, iconY, textPaint) - - // 绘制天数文字 (Dia X) - textPaint.color = textColor - textPaint.textSize = textSize - canvas.drawText(dayStatus.displayText, centerX, circleCenterY + circleRadius + textSize + 5, textPaint) - - // 绘制奖励数值 + // reward text textPaint.color = rewardTextColor textPaint.textSize = rewardTextSize - canvas.drawText(dayStatus.reward, centerX, circleCenterY + circleRadius + textSize + rewardTextSize + 15, textPaint) + canvas.drawText(dayStatus.reward, centerX, vertiMagin + dayTextSize + componentGap + 2*circleRadius + componentGap, textPaint) + } - // 如果是今天,绘制高亮边框 - if (dayStatus.isToday) { - canvas.drawCircle(centerX, circleCenterY, circleRadius + 2, todayHighlightPaint) + fun getBitmap(resId: Int): Bitmap? { + return try { + BitmapFactory.decodeResource(BaseApp.appContext().resources, resId) + } catch (e: Exception) { + e.printStackTrace() + null } } - // ==================== 公开API方法 ==================== - /** - * 更新显示的数据 - * @param data 新的天数状态列表 - */ + + // --------------------- public --------------------- fun updateData(data: List) { dayStatusList = data invalidate() } - /** - * 根据目标日期更新状态(自动计算完成状态) - * @param targetDate 目标日期 - */ fun updateForDate(targetDate: Date) { val targetDay = getDayOfWeekFromDate(targetDate) dayStatusList = generateWeekData(targetDay) invalidate() } - /** - * 刷新为当前日期 - */ fun refreshToCurrentDate() { updateForDate(Date()) } - /** - * 获取当前显示的数据 - */ fun getCurrentData(): List = dayStatusList - /** - * 获取当前高亮的天数(今天) - */ fun getCurrentDay(): Int = currentDay - // ==================== 工具方法 ==================== + private fun generateWeekData(targetDay: Int): List { val rewards = listOf("100", "300", "300", "500", "300", "300", "800") @@ -216,8 +186,6 @@ class WeekStatusView @JvmOverloads constructor( } private fun convertCalendarDayToWeekDay(calendarDay: Int): Int { - // Calendar: 周日=1, 周一=2, ..., 周六=7 - // 转换为: 周一=1, 周二=2, ..., 周日=7 return if (calendarDay == 1) 7 else calendarDay - 1 } diff --git a/app/src/main/res/layout/vididinapp_feature_message_fragment_message.xml b/app/src/main/res/layout/vididinapp_feature_message_fragment_message.xml index 388235e..360ff23 100644 --- a/app/src/main/res/layout/vididinapp_feature_message_fragment_message.xml +++ b/app/src/main/res/layout/vididinapp_feature_message_fragment_message.xml @@ -346,14 +346,14 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" + android:background="@drawable/vididinapp_feature_message_bg_task_login" android:layout_marginTop="10dp"> + android:padding="10dp"> + /> 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 O&p%8k0tee?K>r2lPTQdX literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/task_week_view_ongoing.webp b/app/src/main/res/mipmap-xxhdpi/task_week_view_ongoing.webp new file mode 100644 index 0000000000000000000000000000000000000000..4e1a547a496b544e3acceded26dba25bb23be6c1 GIT binary patch literal 9656 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 LK7kyGa|8Yty!|8K literal 0 HcmV?d00001