Compare commits
3 Commits
874b83b5a2
...
adbf5b4a05
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
adbf5b4a05 | ||
|
|
709e2ba044 | ||
|
|
37e1f1bd3e |
@ -24,7 +24,14 @@
|
||||
"Bash(magick:*)",
|
||||
"Bash(convert:*)",
|
||||
"Bash(python:*)",
|
||||
"Bash(rm:*)"
|
||||
"Bash(rm:*)",
|
||||
"Bash(cp:*)",
|
||||
"Bash(robocopy:*)",
|
||||
"Bash(dir:*)",
|
||||
"Bash(copy:*)",
|
||||
"Bash(.gradlew:*)",
|
||||
"Bash(gradlew.bat assembleDebug:*)",
|
||||
"Bash(mv:*)"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
|
||||
BIN
app/src/main/assets/fonts/alimama_shuhei_bold.ttf
Normal file
@ -4,15 +4,26 @@ import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.chick_mood.data.model.Emotion
|
||||
import com.chick_mood.utils.EmotionResourceManager
|
||||
import com.daodaoshi.chick_mood.databinding.ItemChickImageBinding
|
||||
|
||||
/**
|
||||
* 小鸡形象数据类
|
||||
* @param emotion 情绪类型
|
||||
* @param moodValue 心情值 (0-100)
|
||||
*/
|
||||
data class ChickEmotionData(
|
||||
val emotion: Emotion,
|
||||
val moodValue: Int = 50 // 默认值
|
||||
)
|
||||
|
||||
/**
|
||||
* 小鸡形象适配器
|
||||
* 用于展示不同情绪对应的小鸡图标
|
||||
* 用于展示不同情绪和心情值对应的小鸡图标
|
||||
*/
|
||||
class ChickImageAdapter : RecyclerView.Adapter<ChickImageAdapter.ChickImageViewHolder>() {
|
||||
|
||||
private var emotions: List<Emotion> = emptyList()
|
||||
private var chickEmotions: List<ChickEmotionData> = emptyList()
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChickImageViewHolder {
|
||||
val binding = ItemChickImageBinding.inflate(
|
||||
@ -22,16 +33,24 @@ class ChickImageAdapter : RecyclerView.Adapter<ChickImageAdapter.ChickImageViewH
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: ChickImageViewHolder, position: Int) {
|
||||
holder.bind(emotions[position])
|
||||
holder.bind(chickEmotions[position])
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int = emotions.size
|
||||
override fun getItemCount(): Int = chickEmotions.size
|
||||
|
||||
/**
|
||||
* 更新数据
|
||||
*/
|
||||
fun updateData(newEmotions: List<Emotion>) {
|
||||
emotions = newEmotions
|
||||
fun updateData(newChickEmotions: List<ChickEmotionData>) {
|
||||
chickEmotions = newChickEmotions
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新数据(兼容旧版本,只提供情绪类型)
|
||||
*/
|
||||
fun updateDataFromEmotions(newEmotions: List<Emotion>) {
|
||||
chickEmotions = newEmotions.map { ChickEmotionData(it) }
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
@ -39,18 +58,14 @@ class ChickImageAdapter : RecyclerView.Adapter<ChickImageAdapter.ChickImageViewH
|
||||
private val binding: ItemChickImageBinding
|
||||
) : RecyclerView.ViewHolder(binding.root) {
|
||||
|
||||
fun bind(emotion: Emotion) {
|
||||
// 根据情绪类型设置对应的小鸡图标
|
||||
val chickDrawable = when (emotion) {
|
||||
Emotion.HAPPY -> com.daodaoshi.chick_mood.R.drawable.ic_placeholder_chick_happy
|
||||
Emotion.SAD -> com.daodaoshi.chick_mood.R.drawable.ic_placeholder_chick_sad
|
||||
Emotion.ANGRY -> com.daodaoshi.chick_mood.R.drawable.ic_placeholder_chick_angry
|
||||
Emotion.WORRIED -> com.daodaoshi.chick_mood.R.drawable.ic_placeholder_chick_worried
|
||||
Emotion.LONELY -> com.daodaoshi.chick_mood.R.drawable.ic_placeholder_chick_lonely
|
||||
Emotion.SCARED -> com.daodaoshi.chick_mood.R.drawable.ic_placeholder_chick_scared
|
||||
}
|
||||
fun bind(chickEmotionData: ChickEmotionData) {
|
||||
// 直接使用新的表情资源,自动处理找不到资源的情况
|
||||
val resourceId = EmotionResourceManager.getEmotionResourceId(
|
||||
chickEmotionData.emotion,
|
||||
chickEmotionData.moodValue
|
||||
)
|
||||
|
||||
binding.ivChick.setImageResource(chickDrawable)
|
||||
binding.ivChick.setImageResource(resourceId)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6,9 +6,12 @@ import android.view.ViewGroup
|
||||
import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import android.util.Log
|
||||
import com.chick_mood.data.model.MoodRecord
|
||||
import com.chick_mood.utils.MoodDescriptionGenerator
|
||||
import com.chick_mood.utils.FontUtils
|
||||
import com.daodaoshi.chick_mood.databinding.ItemMoodCardBinding
|
||||
import com.daodaoshi.chick_mood.ImageUtils
|
||||
|
||||
/**
|
||||
* 心情卡片适配器
|
||||
@ -60,40 +63,34 @@ class MoodCardAdapter(
|
||||
)
|
||||
binding.tvMoodDescription.text = moodDescription
|
||||
|
||||
// 应用阿里妈妈数黑体字体到心情文案
|
||||
FontUtils.applyAlimamaShuHeiBold(binding.tvMoodDescription, binding.root.context)
|
||||
|
||||
// 设置收藏状态
|
||||
updateFavoriteIcon(record.isFavorite)
|
||||
|
||||
// 处理文本和图片内容的显示逻辑
|
||||
// 处理文本和图片内容的显示逻辑 - 使用固定布局:左侧100x100dp配图 + 右侧自适应文本
|
||||
val hasText = !record.textContent.isNullOrEmpty()
|
||||
val hasImage = !record.imagePath.isNullOrEmpty()
|
||||
|
||||
if (hasText && hasImage) {
|
||||
// 有图有文:图片在左,文本在右
|
||||
// 有图有文:图片在左(100x100dp),文本在右(自适应)
|
||||
binding.ivImage.visibility = View.VISIBLE
|
||||
binding.tvTextContent.visibility = View.VISIBLE
|
||||
binding.llMainContent.orientation = LinearLayout.HORIZONTAL
|
||||
binding.ivImage.layoutParams = LinearLayout.LayoutParams(80, 80).apply {
|
||||
marginEnd = 12
|
||||
}
|
||||
binding.tvTextContent.text = record.textContent
|
||||
// TODO: 加载真实图片
|
||||
binding.ivImage.setImageResource(com.daodaoshi.chick_mood.R.drawable.placeholder_background)
|
||||
// 加载真实图片
|
||||
Log.d("MoodCardAdapter", "Loading image path: ${record.imagePath}")
|
||||
ImageUtils.loadImage(binding.ivImage, record.imagePath)
|
||||
} else if (hasImage && !hasText) {
|
||||
// 有图无文:图片居中显示
|
||||
// 有图无文:图片在左(100x100dp),右侧空白
|
||||
binding.ivImage.visibility = View.VISIBLE
|
||||
binding.tvTextContent.visibility = View.GONE
|
||||
binding.llMainContent.orientation = LinearLayout.VERTICAL
|
||||
binding.llMainContent.gravity = android.view.Gravity.CENTER
|
||||
binding.ivImage.layoutParams = LinearLayout.LayoutParams(120, 120).apply {
|
||||
marginEnd = 0
|
||||
}
|
||||
// TODO: 加载真实图片
|
||||
binding.ivImage.setImageResource(com.daodaoshi.chick_mood.R.drawable.placeholder_background)
|
||||
// 加载真实图片
|
||||
ImageUtils.loadImage(binding.ivImage, record.imagePath)
|
||||
} else if (hasText && !hasImage) {
|
||||
// 无图有文:文本占满整个内容区域
|
||||
// 无图有文:左侧空白,文本在右(占满右侧)
|
||||
binding.ivImage.visibility = View.GONE
|
||||
binding.tvTextContent.visibility = View.VISIBLE
|
||||
binding.llMainContent.orientation = LinearLayout.VERTICAL
|
||||
binding.tvTextContent.text = record.textContent
|
||||
} else {
|
||||
// 无图无文:隐藏内容区域
|
||||
|
||||
152
app/src/main/java/com/chick_mood/utils/EmotionResourceManager.kt
Normal file
@ -0,0 +1,152 @@
|
||||
package com.chick_mood.utils
|
||||
|
||||
import com.chick_mood.data.model.Emotion
|
||||
import com.daodaoshi.chick_mood.R
|
||||
|
||||
/**
|
||||
* 心情表情资源映射器
|
||||
* 根据情绪类型和心情值动态选择对应的表情图片
|
||||
*/
|
||||
object EmotionResourceManager {
|
||||
|
||||
/**
|
||||
* 根据情绪类型和心情值获取对应的表情资源名称
|
||||
* @param emotion 情绪类型
|
||||
* @param moodValue 心情值 (0-100)
|
||||
* @return 表情资源名称(英文名称)
|
||||
*/
|
||||
fun getEmotionResourceName(emotion: Emotion, moodValue: Int): String {
|
||||
val degreeLevel = getDegreeLevel(moodValue)
|
||||
val emotionPrefix = getEmotionEnglishPrefix(emotion)
|
||||
|
||||
return "${emotionPrefix}_${degreeLevel}"
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据心情值获取程度级别
|
||||
* @param moodValue 心情值 (0-100)
|
||||
* @return 程度级别描述
|
||||
*/
|
||||
private fun getDegreeLevel(moodValue: Int): String {
|
||||
return when (moodValue) {
|
||||
in 0..20 -> "level1" // 有些
|
||||
in 21..40 -> "level2" // 非常
|
||||
in 41..60 -> "level3" // 超级
|
||||
in 61..80 -> "level4" // 超级非常
|
||||
in 81..100 -> "level5" // 无法控制
|
||||
else -> "level1"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据情绪类型获取对应的英文前缀
|
||||
* @param emotion 情绪类型
|
||||
* @return 英文前缀
|
||||
*/
|
||||
private fun getEmotionEnglishPrefix(emotion: Emotion): String {
|
||||
return when (emotion) {
|
||||
Emotion.HAPPY -> "happy"
|
||||
Emotion.SAD -> "sad"
|
||||
Emotion.ANGRY -> "angry"
|
||||
Emotion.WORRIED -> "worried"
|
||||
Emotion.LONELY -> "lonely"
|
||||
Emotion.SCARED -> "scared"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取情绪选择弹窗中使用的表情资源(基础表情)
|
||||
* 在心情选择界面使用统一的基础表情
|
||||
* @param emotion 情绪类型
|
||||
* @return 基础表情资源ID
|
||||
*/
|
||||
fun getEmotionSelectionResource(emotion: Emotion): String {
|
||||
return when (emotion) {
|
||||
Emotion.HAPPY -> "ic_emotion_happy"
|
||||
Emotion.SAD -> "ic_emotion_sad"
|
||||
Emotion.ANGRY -> "ic_emotion_angry"
|
||||
Emotion.WORRIED -> "ic_emotion_worried"
|
||||
Emotion.LONELY -> "ic_emotion_lonely"
|
||||
Emotion.SCARED -> "ic_emotion_scared"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取基于心情值的表情资源ID
|
||||
* @param emotion 情绪类型
|
||||
* @param moodValue 心情值 (0-100)
|
||||
* @return 表情资源ID,如果找不到则返回占位符资源
|
||||
*/
|
||||
fun getEmotionResourceId(emotion: Emotion, moodValue: Int): Int {
|
||||
val degreeLevel = getDegreeLevel(moodValue)
|
||||
val emotionPrefix = getEmotionEnglishPrefix(emotion)
|
||||
val resourceName = "${emotionPrefix}_${degreeLevel}"
|
||||
|
||||
return try {
|
||||
// 使用反射获取资源ID
|
||||
val resourceIdField = R.drawable::class.java.getDeclaredField(resourceName)
|
||||
resourceIdField.getInt(null)
|
||||
} catch (e: Exception) {
|
||||
// 如果找不到对应的表情资源,返回占位符资源
|
||||
getPlaceholderResourceId(emotion)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取占位符资源ID
|
||||
* @param emotion 情绪类型
|
||||
* @return 占位符资源ID
|
||||
*/
|
||||
private fun getPlaceholderResourceId(emotion: Emotion): Int {
|
||||
return when (emotion) {
|
||||
Emotion.HAPPY -> R.drawable.ic_placeholder_chick_happy
|
||||
Emotion.SAD -> R.drawable.ic_placeholder_chick_sad
|
||||
Emotion.ANGRY -> R.drawable.ic_placeholder_chick_angry
|
||||
Emotion.WORRIED -> R.drawable.ic_placeholder_chick_worried
|
||||
Emotion.LONELY -> R.drawable.ic_placeholder_chick_lonely
|
||||
Emotion.SCARED -> R.drawable.ic_placeholder_chick_scared
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取占位符小鸡表情资源
|
||||
* 在没有心情值数据时使用的默认表情
|
||||
* @param emotion 情绪类型
|
||||
* @return 占位符资源ID
|
||||
*/
|
||||
fun getPlaceholderEmotionResource(emotion: Emotion): String {
|
||||
return when (emotion) {
|
||||
Emotion.HAPPY -> "ic_placeholder_chick_happy"
|
||||
Emotion.SAD -> "ic_placeholder_chick_sad"
|
||||
Emotion.ANGRY -> "ic_placeholder_chick_angry"
|
||||
Emotion.WORRIED -> "ic_placeholder_chick_worried"
|
||||
Emotion.LONELY -> "ic_placeholder_chick_lonely"
|
||||
Emotion.SCARED -> "ic_placeholder_chick_scared"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据心情值和情绪类型获取表情图片文件的完整路径
|
||||
* 这个方法用于后续直接复制文件到drawable目录后的资源引用
|
||||
*/
|
||||
fun getEmotionImagePath(emotion: Emotion, moodValue: Int): String {
|
||||
val degreeLevel = when {
|
||||
moodValue <= 20 -> "有些"
|
||||
moodValue <= 40 -> "非常"
|
||||
moodValue <= 60 -> "超级"
|
||||
moodValue <= 80 -> "这也太"
|
||||
else -> "无法控制"
|
||||
}
|
||||
|
||||
val emotionName = when (emotion) {
|
||||
Emotion.HAPPY -> "开心"
|
||||
Emotion.SAD -> "悲伤"
|
||||
Emotion.ANGRY -> "生气"
|
||||
Emotion.WORRIED -> "烦恼"
|
||||
Emotion.LONELY -> "孤单"
|
||||
Emotion.SCARED -> "害怕"
|
||||
}
|
||||
|
||||
return "${emotionName}${degreeLevel}"
|
||||
}
|
||||
}
|
||||
64
app/src/main/java/com/chick_mood/utils/FontUtils.kt
Normal file
@ -0,0 +1,64 @@
|
||||
package com.chick_mood.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Typeface
|
||||
import android.util.Log
|
||||
|
||||
/**
|
||||
* 字体工具类
|
||||
* 用于从assets目录加载字体
|
||||
*/
|
||||
object FontUtils {
|
||||
|
||||
private var alimamaTypeface: Typeface? = null
|
||||
|
||||
/**
|
||||
* 获取阿里妈妈数黑体
|
||||
* @param context 上下文
|
||||
* @return Typeface对象
|
||||
*/
|
||||
fun getAlimamaShuHeiBoldTypeface(context: Context): Typeface {
|
||||
if (alimamaTypeface == null) {
|
||||
try {
|
||||
alimamaTypeface = Typeface.createFromAsset(context.assets, "fonts/alimama_shuhei_bold.ttf")
|
||||
if (alimamaTypeface != null) {
|
||||
Log.d("FontUtils", "阿里妈妈数黑体加载成功")
|
||||
} else {
|
||||
Log.w("FontUtils", "阿里妈妈数黑体加载失败,使用默认字体")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e("FontUtils", "加载字体时出错: ${e.message}")
|
||||
}
|
||||
}
|
||||
return alimamaTypeface ?: Typeface.DEFAULT
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取系统默认粗体字体
|
||||
* @param context 上下文
|
||||
* @return Typeface对象
|
||||
*/
|
||||
fun getSystemBoldTypeface(context: Context): Typeface {
|
||||
return Typeface.create("sans-serif", Typeface.BOLD)
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用阿里妈妈数黑体到TextView
|
||||
* @param textView 目标TextView
|
||||
* @param context 上下文
|
||||
*/
|
||||
fun applyAlimamaShuHeiBold(textView: android.widget.TextView, context: Context) {
|
||||
val typeface = getAlimamaShuHeiBoldTypeface(context)
|
||||
textView.typeface = typeface
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用阿里妈妈数黑体到多个TextView
|
||||
* @param textViews 目标TextView数组
|
||||
* @param context 上下文
|
||||
*/
|
||||
fun applyAlimamaShuHeiBold(textViews: Array<android.widget.TextView>, context: Context) {
|
||||
val typeface = getAlimamaShuHeiBoldTypeface(context)
|
||||
textViews.forEach { it.typeface = typeface }
|
||||
}
|
||||
}
|
||||
@ -24,6 +24,7 @@ import androidx.core.content.ContextCompat
|
||||
import android.os.Vibrator
|
||||
import android.os.VibrationEffect
|
||||
import com.chick_mood.data.model.Emotion
|
||||
import com.chick_mood.utils.EmotionResourceManager
|
||||
import java.text.DecimalFormat
|
||||
|
||||
/**
|
||||
@ -252,6 +253,9 @@ class AddActivity : AppCompatActivity(), SensorEventListener {
|
||||
tvMoodText.text = "开始!"
|
||||
tvMoodValue.text = moodValueFormatter.format(currentMoodValue)
|
||||
progressBar.progress = 0
|
||||
|
||||
// 更新小鸡表情(使用基础表情,因为心情值为0)
|
||||
updateChickExpression()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -284,10 +288,24 @@ class AddActivity : AppCompatActivity(), SensorEventListener {
|
||||
tvMoodValue.text = moodValueFormatter.format(currentMoodValue)
|
||||
progressBar.progress = currentMoodValue
|
||||
|
||||
// 更新小鸡表情(基于心情值和情绪类型)
|
||||
updateChickExpression()
|
||||
|
||||
// 更新心情文案
|
||||
updateMoodText()
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新小鸡表情
|
||||
*/
|
||||
private fun updateChickExpression() {
|
||||
selectedEmotion?.let { emotion ->
|
||||
// 直接使用新的表情资源,自动处理找不到资源的情况
|
||||
val resourceId = EmotionResourceManager.getEmotionResourceId(emotion, currentMoodValue)
|
||||
ivChick.setImageResource(resourceId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新心情文案
|
||||
*/
|
||||
|
||||
@ -14,6 +14,8 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import com.chick_mood.data.database.SimpleDatabaseManager
|
||||
import com.chick_mood.data.model.Emotion
|
||||
import com.chick_mood.data.model.MoodRecord
|
||||
import com.chick_mood.utils.FontUtils
|
||||
import com.chick_mood.utils.EmotionResourceManager
|
||||
import com.daodaoshi.chick_mood.ImageUtils
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -88,13 +90,17 @@ class DetailActivity : AppCompatActivity() {
|
||||
// 设置时间显示
|
||||
timeText.text = formatTime(record.timestamp)
|
||||
|
||||
// 设置小鸡形象
|
||||
chickImage.setImageResource(getEmotionIconResource(record.emotion))
|
||||
// 设置小鸡形象(基于心情值和情绪类型)
|
||||
val resourceId = EmotionResourceManager.getEmotionResourceId(record.emotion, record.moodIntensity)
|
||||
chickImage.setImageResource(resourceId)
|
||||
|
||||
// 设置心情值和文案
|
||||
moodValueText.text = record.moodIntensity.toString()
|
||||
moodText.text = generateMoodText(record.moodIntensity, record.emotion)
|
||||
|
||||
// 应用阿里妈妈数黑体字体到心情文案
|
||||
FontUtils.applyAlimamaShuHeiBold(moodText, this)
|
||||
|
||||
// 设置图片内容(如果有)
|
||||
if (record.imagePath != null) {
|
||||
imageContent.visibility = View.VISIBLE
|
||||
|
||||
@ -16,6 +16,8 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import com.chick_mood.data.database.SimpleDatabaseManager
|
||||
import com.chick_mood.data.model.Emotion
|
||||
import com.chick_mood.data.model.MoodRecord
|
||||
import com.chick_mood.utils.FontUtils
|
||||
import com.chick_mood.utils.EmotionResourceManager
|
||||
import com.daodaoshi.chick_mood.ImageUtils
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@ -249,13 +251,17 @@ class EditActivity : AppCompatActivity() {
|
||||
// 设置时间显示
|
||||
timeText.text = formatTime(record.timestamp)
|
||||
|
||||
// 设置小鸡形象
|
||||
chickImage.setImageResource(getEmotionIconResource(record.emotion))
|
||||
// 设置小鸡形象(基于心情值和情绪类型)
|
||||
val resourceId = EmotionResourceManager.getEmotionResourceId(record.emotion, record.moodIntensity)
|
||||
chickImage.setImageResource(resourceId)
|
||||
|
||||
// 设置心情值和文案
|
||||
moodValueText.text = record.moodIntensity.toString()
|
||||
moodText.text = generateMoodText(record.moodIntensity, record.emotion)
|
||||
|
||||
// 应用阿里妈妈数黑体字体到心情文案
|
||||
FontUtils.applyAlimamaShuHeiBold(moodText, this)
|
||||
|
||||
// 设置文本内容
|
||||
textInput.setText(record.textContent ?: "")
|
||||
updateCharCount()
|
||||
|
||||
@ -6,6 +6,7 @@ import android.graphics.BitmapFactory
|
||||
import android.net.Uri
|
||||
import android.provider.MediaStore
|
||||
import android.util.Log
|
||||
import android.widget.ImageView
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.File
|
||||
@ -66,6 +67,34 @@ object ImageUtils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从文件路径加载图片到ImageView(简化版本)
|
||||
*/
|
||||
fun loadImage(imageView: ImageView, imagePath: String?) {
|
||||
if (!imagePath.isNullOrEmpty()) {
|
||||
imageView.setImageResource(com.daodaoshi.chick_mood.R.drawable.placeholder_background)
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
val file = File(imagePath)
|
||||
if (file.exists()) {
|
||||
val bitmap = BitmapFactory.decodeFile(file.absolutePath)
|
||||
if (bitmap != null) {
|
||||
imageView.setImageBitmap(bitmap)
|
||||
} else {
|
||||
imageView.setImageResource(com.daodaoshi.chick_mood.R.drawable.placeholder_background)
|
||||
}
|
||||
} else {
|
||||
Log.w(TAG, "图片文件不存在: $imagePath")
|
||||
imageView.setImageResource(com.daodaoshi.chick_mood.R.drawable.placeholder_background)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "加载图片失败", e)
|
||||
imageView.setImageResource(com.daodaoshi.chick_mood.R.drawable.placeholder_background)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从文件路径加载Bitmap
|
||||
*/
|
||||
|
||||
@ -13,6 +13,7 @@ import com.chick_mood.data.database.SimpleDatabaseManager
|
||||
import com.chick_mood.ui.emotion.EmotionSelectorDialog
|
||||
import com.chick_mood.ui.adapter.MoodCardAdapter
|
||||
import com.chick_mood.ui.adapter.ChickImageAdapter
|
||||
import com.chick_mood.ui.adapter.ChickEmotionData
|
||||
import com.chick_mood.data.model.Emotion
|
||||
import com.chick_mood.data.model.MoodRecord
|
||||
import java.text.SimpleDateFormat
|
||||
@ -22,6 +23,7 @@ import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import com.chick_mood.utils.MoodDescriptionGenerator
|
||||
import com.chick_mood.utils.FontUtils
|
||||
|
||||
/**
|
||||
* 简化的首页Activity - 主要用于展示历史心情记录和创建新记录的入口
|
||||
@ -242,6 +244,9 @@ class MainActivitySimple : AppCompatActivity() {
|
||||
|
||||
binding.tvWeekday.text = weekdayText
|
||||
binding.tvTime.text = time
|
||||
|
||||
// 应用阿里妈妈数黑体字体
|
||||
FontUtils.applyAlimamaShuHeiBold(binding.tvWeekday, this)
|
||||
}
|
||||
}
|
||||
|
||||
@ -396,8 +401,10 @@ class MainActivitySimple : AppCompatActivity() {
|
||||
moodCardAdapter.updateData(records)
|
||||
|
||||
// 更新小鸡形象适配器
|
||||
val emotions = records.map { it.emotion }
|
||||
chickImageAdapter.updateData(emotions)
|
||||
val chickEmotions = records.map {
|
||||
ChickEmotionData(it.emotion, it.moodIntensity)
|
||||
}
|
||||
chickImageAdapter.updateData(chickEmotions)
|
||||
|
||||
// 更新时间信息(显示第一条记录的时间)
|
||||
updateTimeInfo(0)
|
||||
|
||||
BIN
app/src/main/res/drawable/angry_level1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
app/src/main/res/drawable/angry_level2.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
app/src/main/res/drawable/angry_level3.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/angry_level4.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/angry_level5.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
6
app/src/main/res/drawable/bg_detail_button.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="8dp" />
|
||||
<solid android:color="#FFAC46" />
|
||||
</shape>
|
||||
16
app/src/main/res/drawable/card_selector.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true">
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="#1A000000" />
|
||||
<corners android:radius="16dp" />
|
||||
<stroke android:width="2dp" android:color="#FFAC46" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:shape="rectangle">
|
||||
<solid android:color="@android:color/transparent" />
|
||||
<corners android:radius="16dp" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
BIN
app/src/main/res/drawable/happy_level1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
app/src/main/res/drawable/happy_level2.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
app/src/main/res/drawable/happy_level3.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/happy_level4.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/happy_level5.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
BIN
app/src/main/res/drawable/lonely_level1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
app/src/main/res/drawable/lonely_level2.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
app/src/main/res/drawable/lonely_level3.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/lonely_level4.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/lonely_level5.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/sad_level1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
app/src/main/res/drawable/sad_level2.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
app/src/main/res/drawable/sad_level3.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/sad_level4.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/sad_level5.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/scared_level1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
app/src/main/res/drawable/scared_level2.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
app/src/main/res/drawable/scared_level3.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/scared_level4.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/scared_level5.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
9
app/src/main/res/drawable/shape_button_ripple.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="#33FFFFFF">
|
||||
<item android:id="@android:id/background">
|
||||
<shape android:shape="oval">
|
||||
<solid android:color="@android:color/transparent" />
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
BIN
app/src/main/res/drawable/worried_level1.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
app/src/main/res/drawable/worried_level2.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
app/src/main/res/drawable/worried_level3.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/worried_level4.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
app/src/main/res/drawable/worried_level5.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
@ -91,7 +91,6 @@
|
||||
android:id="@+id/mood_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="完全无法控制 开心"
|
||||
android:textSize="18sp"
|
||||
android:textColor="@color/text_secondary" />
|
||||
|
||||
|
||||
@ -89,7 +89,6 @@
|
||||
android:id="@+id/mood_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="完全无法控制 开心"
|
||||
android:textSize="18sp"
|
||||
android:textColor="@color/text_secondary" />
|
||||
|
||||
|
||||
@ -164,6 +164,8 @@
|
||||
android:layout_marginBottom="24dp"
|
||||
android:elevation="4dp"
|
||||
android:stateListAnimator="@null"
|
||||
android:drawableStart="@drawable/ic_add_mood"
|
||||
android:drawablePadding="8dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
|
||||
@ -4,77 +4,82 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:cardCornerRadius="12dp"
|
||||
app:cardElevation="2dp"
|
||||
app:cardBackgroundColor="@color/white">
|
||||
android:layout_margin="4dp"
|
||||
app:cardCornerRadius="16dp"
|
||||
app:cardElevation="3dp"
|
||||
app:cardBackgroundColor="@color/white"
|
||||
android:foreground="@drawable/card_selector">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dp">
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="20dp">
|
||||
|
||||
<!-- 心情文案 - 左上角 -->
|
||||
<!-- 顶部区域:心情文案标题 + 查看详情按钮 -->
|
||||
<TextView
|
||||
android:id="@+id/tv_mood_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="@color/text_primary"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
android:layout_marginEnd="8dp"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@id/btn_detail"
|
||||
tools:text="完全无法控制 开心" />
|
||||
tools:text="有些 开心" />
|
||||
|
||||
<!-- 查看详情按钮 - 右上角 -->
|
||||
<ImageView
|
||||
<!-- 查看详情按钮 - 右上角,橙色 -->
|
||||
<TextView
|
||||
android:id="@+id/btn_detail"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:src="@drawable/ic_more_info"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:tint="@color/text_secondary"
|
||||
android:padding="2dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="查看详情"
|
||||
android:textSize="13sp"
|
||||
android:textColor="@color/white"
|
||||
android:textStyle="bold"
|
||||
android:background="@drawable/bg_detail_button"
|
||||
android:paddingHorizontal="14dp"
|
||||
android:paddingVertical="8dp"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:contentDescription="查看详情"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
|
||||
<!-- 主要内容区域 -->
|
||||
<!-- 中间内容区域:固定尺寸,左侧配图 + 右侧文本 -->
|
||||
<LinearLayout
|
||||
android:id="@+id/ll_main_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_height="100dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="top"
|
||||
app:layout_constraintTop_toBottomOf="@id/tv_mood_description"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<!-- 左侧图片区域 -->
|
||||
<!-- 左侧图片区域 - 1:1比例,100x100dp -->
|
||||
<ImageView
|
||||
android:id="@+id/iv_image"
|
||||
android:layout_width="80dp"
|
||||
android:layout_height="80dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="100dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:scaleType="centerCrop"
|
||||
android:visibility="gone"
|
||||
android:background="@drawable/placeholder_background"
|
||||
android:contentDescription="心情图片" />
|
||||
android:background="@drawable/shape_image_background"
|
||||
android:contentDescription="心情配图" />
|
||||
|
||||
<!-- 右侧文本区域 -->
|
||||
<!-- 右侧文本区域 - 自适应宽度,超出显示... -->
|
||||
<TextView
|
||||
android:id="@+id/tv_text_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:textSize="14sp"
|
||||
android:layout_weight="1"
|
||||
android:textSize="15sp"
|
||||
android:textColor="@color/text_secondary"
|
||||
android:lineSpacingExtra="2dp"
|
||||
android:lineSpacingExtra="3dp"
|
||||
android:maxLines="4"
|
||||
android:ellipsize="end"
|
||||
android:gravity="top"
|
||||
@ -83,35 +88,35 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- 操作按钮区域 - 右下角 -->
|
||||
<!-- 底部操作区域:收藏和分享按钮,居右下角 -->
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginTop="16dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent">
|
||||
|
||||
<!-- 收藏按钮 -->
|
||||
<ImageView
|
||||
android:id="@+id/btn_favorite"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:src="@drawable/ic_card_favorite_border"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:padding="2dp"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:src="@drawable/ic_favorite_border"
|
||||
android:background="@drawable/shape_button_ripple"
|
||||
android:padding="4dp"
|
||||
android:contentDescription="收藏" />
|
||||
|
||||
<!-- 分享按钮 -->
|
||||
<ImageView
|
||||
android:id="@+id/btn_share"
|
||||
android:layout_width="20dp"
|
||||
android:layout_height="20dp"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:src="@drawable/ic_card_share"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:padding="2dp"
|
||||
android:src="@drawable/ic_share"
|
||||
android:background="@drawable/shape_button_ripple"
|
||||
android:padding="4dp"
|
||||
android:contentDescription="分享" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
22
claude.md
@ -6,9 +6,9 @@
|
||||
|
||||
**项目名称:** 别摇小鸡心情记录App
|
||||
**开发平台:** Android原生(Kotlin)
|
||||
**当前版本:** V1.4.0
|
||||
**更新日期:** 2025-10-24
|
||||
**开发状态:** ✅ 添加心情功能完成,摇晃检测和震动反馈集成
|
||||
**当前版本:** V1.4.1
|
||||
**更新日期:** 2025-10-27
|
||||
**开发状态:** ✅ UI和字体优化完成,等待下一步开发安排
|
||||
|
||||
---
|
||||
|
||||
@ -628,6 +628,22 @@ Chick_Mood/
|
||||
3. **用户体验:** 摇晃检测灵敏度需要平衡,既不能太敏感也不能太迟钝
|
||||
4. **数据一致性:** 确保整个流程中数据传递的准确性和完整性
|
||||
|
||||
**2025-10-27 (V1.4.1 UI和字体优化)**
|
||||
- ✅ **心情卡片UI重设计**:简洁清新风格,白色底色,三部分信息区域划分
|
||||
- ✅ **顶部设计优化**:心情文案标题 + 橙色"查看详情"文本按钮,醒目位置
|
||||
- ✅ **中间布局优化**:左侧1:1配图(100x100dp) + 右侧自适应文本(最多4行,超出显示"...")
|
||||
- ✅ **底部设计简化**:只保留收藏和分享按钮,居右下角,符合用户习惯
|
||||
- ✅ **交互反馈增强**:按钮涟漪效果,选中卡片有主题色边框高亮
|
||||
- ✅ **卡片样式优化**:16dp圆角,3dp细腻阴影,4dp边距避免拥挤
|
||||
- ✅ **配图显示修复**:真实图片加载和显示,完善异常处理和回退机制
|
||||
- ✅ **阿里妈妈数黑体集成**:
|
||||
- 字体文件配置:从font/阿里妈妈数黑体/目录复制AlimamaShuHeiTi-Bold.ttf到assets/fonts/
|
||||
- FontUtils工具类:assets方式字体加载,单例模式,完善异常处理
|
||||
- 应用范围:首页星期数文本、心情卡片文案、详情页心情文案、编辑页心情文案
|
||||
- 降级机制:字体加载失败时自动回退到系统默认字体
|
||||
- ✅ **构建和部署成功**:所有UI优化和字体配置已完成,APK成功构建并安装
|
||||
- ✅ **当前版本**:V1.4.1 UI和字体优化完成,等待下一步开发安排
|
||||
|
||||
---
|
||||
|
||||
*此文档将随着开发进展持续更新,记录重要的技术决策和进度变化。*
|
||||
BIN
image/表情/孤单/无法控制孤单.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/孤单/有些孤单.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
image/表情/孤单/超级孤单.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
image/表情/孤单/超级非常孤单.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/孤单/非常孤单.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
image/表情/害怕/无法控制害怕.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/害怕/有些害怕.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
image/表情/害怕/超级害怕.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
image/表情/害怕/超级非常害怕.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/害怕/非常害怕.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
image/表情/开心/无法控制开心.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/开心/有些开心.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
image/表情/开心/超级开心.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
image/表情/开心/超级非常开心.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/开心/非常开心.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
image/表情/悲伤/无法控制悲伤.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/悲伤/有些悲伤.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
image/表情/悲伤/超级悲伤.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
image/表情/悲伤/超级非常悲伤.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/悲伤/非常悲伤.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
image/表情/烦恼/无法控制烦恼.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/烦恼/有些烦恼.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
image/表情/烦恼/超级烦恼.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
image/表情/烦恼/超级非常烦恼.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/烦恼/非常烦恼.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
image/表情/生气/无法控制生气.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/生气/有些生气.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
image/表情/生气/超级生气.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
image/表情/生气/超级非常生气.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
image/表情/生气/非常生气.png
Normal file
|
After Width: | Height: | Size: 142 KiB |