diff --git a/app/mood/edit.tsx b/app/mood/edit.tsx index 9ca2eba..d1a1e78 100644 --- a/app/mood/edit.tsx +++ b/app/mood/edit.tsx @@ -199,28 +199,36 @@ export default function MoodEditScreen() { onValueChange={handleIntensityChange} min={1} max={10} - width={320} + width={280} + height={12} /> {/* 心情描述 */} - {selectedMood && ( - - 心情描述(可选) - - {description.length}/200 - - )} + + + 心情日记 + 记录你的心情,珍藏美好回忆 + + {description.length}/1000 + + {/* 底部按钮 */} @@ -242,7 +250,7 @@ export default function MoodEditScreen() { onPress={handleDelete} disabled={isDeleting} > - + )} @@ -265,21 +273,21 @@ const styles = StyleSheet.create({ }, decorativeCircle1: { position: 'absolute', - top: 40, - right: 20, - width: 60, - height: 60, - borderRadius: 30, + top: 30, + right: 15, + width: 45, + height: 45, + borderRadius: 22.5, backgroundColor: '#7a5af8', - opacity: 0.08, + opacity: 0.06, }, decorativeCircle2: { position: 'absolute', - bottom: -15, - left: -15, - width: 40, - height: 40, - borderRadius: 20, + bottom: -10, + left: -10, + width: 30, + height: 30, + borderRadius: 15, backgroundColor: '#7a5af8', opacity: 0.04, }, @@ -292,38 +300,38 @@ const styles = StyleSheet.create({ }, dateSection: { backgroundColor: 'rgba(255,255,255,0.95)', - margin: 16, - borderRadius: 20, - padding: 20, + margin: 12, + borderRadius: 16, + padding: 16, alignItems: 'center', shadowColor: '#7a5af8', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.1, - shadowRadius: 12, - elevation: 6, + shadowOffset: { width: 0, height: 3 }, + shadowOpacity: 0.08, + shadowRadius: 8, + elevation: 4, }, dateTitle: { - fontSize: 26, - fontWeight: '800', + fontSize: 20, + fontWeight: '700', color: '#192126', }, moodSection: { backgroundColor: 'rgba(255,255,255,0.95)', - margin: 16, + margin: 12, marginTop: 0, - borderRadius: 20, - padding: 20, + borderRadius: 16, + padding: 16, shadowColor: '#7a5af8', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.1, - shadowRadius: 12, - elevation: 6, + shadowOffset: { width: 0, height: 3 }, + shadowOpacity: 0.08, + shadowRadius: 8, + elevation: 4, }, sectionTitle: { - fontSize: 20, - fontWeight: '700', + fontSize: 16, + fontWeight: '600', color: '#192126', - marginBottom: 20, + marginBottom: 16, }, moodOptions: { flexDirection: 'row', @@ -333,9 +341,9 @@ const styles = StyleSheet.create({ moodOption: { width: '18%', alignItems: 'center', - paddingVertical: 16, - marginBottom: 12, - borderRadius: 16, + paddingVertical: 12, + marginBottom: 8, + borderRadius: 12, backgroundColor: 'rgba(122,90,248,0.05)', borderWidth: 1, borderColor: 'rgba(122,90,248,0.1)', @@ -346,55 +354,63 @@ const styles = StyleSheet.create({ borderColor: '#7a5af8', shadowColor: '#7a5af8', shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.15, - shadowRadius: 4, + shadowOpacity: 0.12, + shadowRadius: 3, elevation: 2, }, moodImage: { - width: 40, - height: 40, - marginBottom: 10, + width: 32, + height: 32, + marginBottom: 6, }, moodLabel: { - fontSize: 14, + fontSize: 12, color: '#192126', - fontWeight: '600', + fontWeight: '500', }, intensitySection: { backgroundColor: 'rgba(255,255,255,0.95)', - margin: 16, + margin: 12, marginTop: 0, - borderRadius: 20, - padding: 20, + borderRadius: 16, + padding: 16, shadowColor: '#7a5af8', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.1, - shadowRadius: 12, - elevation: 6, + shadowOffset: { width: 0, height: 3 }, + shadowOpacity: 0.08, + shadowRadius: 8, + elevation: 4, }, descriptionSection: { backgroundColor: 'rgba(255,255,255,0.95)', - margin: 16, + margin: 12, marginTop: 0, - borderRadius: 20, - padding: 20, + borderRadius: 16, + padding: 16, shadowColor: '#7a5af8', - shadowOffset: { width: 0, height: 4 }, - shadowOpacity: 0.1, - shadowRadius: 12, - elevation: 6, + shadowOffset: { width: 0, height: 3 }, + shadowOpacity: 0.08, + shadowRadius: 8, + elevation: 4, + }, + diarySubtitle: { + fontSize: 13, + color: '#666', + fontWeight: '500', + marginBottom: 12, + lineHeight: 18, }, descriptionInput: { borderWidth: 1.5, borderColor: 'rgba(122,90,248,0.2)', - borderRadius: 12, - padding: 16, - fontSize: 16, - minHeight: 100, + borderRadius: 10, + padding: 12, + fontSize: 14, + minHeight: 120, textAlignVertical: 'top', backgroundColor: 'rgba(122,90,248,0.02)', color: '#192126', + lineHeight: 20, }, characterCount: { fontSize: 12, @@ -404,9 +420,9 @@ const styles = StyleSheet.create({ fontWeight: '500', }, footer: { - padding: 16, + padding: 12, position: 'absolute', - bottom: 24, + bottom: 20, right: 8, }, buttonRow: { @@ -416,24 +432,24 @@ const styles = StyleSheet.create({ }, saveButton: { backgroundColor: '#7a5af8', - borderRadius: 12, - paddingVertical: 12, - paddingHorizontal: 24, + borderRadius: 10, + paddingVertical: 10, + paddingHorizontal: 20, alignItems: 'center', - marginLeft: 12, + marginLeft: 8, shadowColor: '#7a5af8', shadowOffset: { width: 0, height: 2 }, - shadowOpacity: 0.2, - shadowRadius: 4, - elevation: 3, + shadowOpacity: 0.15, + shadowRadius: 3, + elevation: 2, }, deleteIconButton: { - width: 36, - height: 36, - borderRadius: 18, + width: 32, + height: 32, + borderRadius: 16, justifyContent: 'center', alignItems: 'center', - marginLeft: 12, + marginLeft: 8, }, deleteButton: { backgroundColor: '#f95555', @@ -454,7 +470,7 @@ const styles = StyleSheet.create({ }, saveButtonText: { color: '#fff', - fontSize: 14, + fontSize: 13, fontWeight: '600', }, deleteButtonText: { diff --git a/components/MoodIntensitySlider.tsx b/components/MoodIntensitySlider.tsx index f32bc1b..b360e2c 100644 --- a/components/MoodIntensitySlider.tsx +++ b/components/MoodIntensitySlider.tsx @@ -39,10 +39,11 @@ export default function MoodIntensitySlider({ width = 320, height = 16, // 更粗的进度条 }: MoodIntensitySliderProps) { + const thumbSize = 32; // 合适的触摸区域 const translateX = useSharedValue(0); - const sliderWidth = width - 40; // 减去thumb的宽度 - const thumbSize = 36; // 更大的thumb - + const isDragging = useSharedValue(0); + const sliderWidth = width - thumbSize; // thumb中心移动的有效范围 + // 计算初始位置 React.useEffect(() => { const initialPosition = ((value - min) / (max - min)) * sliderWidth; @@ -60,16 +61,17 @@ export default function MoodIntensitySlider({ onStart: (_, context) => { context.startX = translateX.value; context.lastValue = value; + isDragging.value = withSpring(1); runOnJS(triggerHaptics)(); }, onActive: (event, context) => { const newX = context.startX + event.translationX; const clampedX = Math.max(0, Math.min(sliderWidth, newX)); translateX.value = clampedX; - + // 计算当前值 const currentValue = Math.round((clampedX / sliderWidth) * (max - min) + min); - + // 当值改变时触发震动和回调 if (currentValue !== context.lastValue) { context.lastValue = currentValue; @@ -81,28 +83,52 @@ export default function MoodIntensitySlider({ // 计算最终值并吸附到最近的步长 const currentValue = Math.round((translateX.value / sliderWidth) * (max - min) + min); const snapPosition = ((currentValue - min) / (max - min)) * sliderWidth; - + translateX.value = withSpring(snapPosition); + isDragging.value = withSpring(0); runOnJS(triggerHaptics)(); runOnJS(onValueChange)(currentValue); }, }); const thumbStyle = useAnimatedStyle(() => { - const scale = interpolate( + const positionScale = interpolate( translateX.value, [0, sliderWidth], - [1, 1.05] + [1, 1.1] ); + const dragScale = interpolate( + isDragging.value, + [0, 1], + [1, 1.2] + ); + + const finalScale = positionScale * dragScale; + + // 让thumb在滑动条中正确居中 + const thumbPosition = translateX.value + thumbSize / 2; + return { transform: [ - { translateX: translateX.value }, - { scale: withSpring(scale) } + { translateX: thumbPosition }, + { scale: withSpring(finalScale) } ], }; }); + const thumbInnerStyle = useAnimatedStyle(() => { + const borderColor = interpolateColor( + isDragging.value, + [0, 1], + ['#7a5af8', '#ff6b6b'] + ); + + return { + borderColor: borderColor, + }; + }); + const progressStyle = useAnimatedStyle(() => { const progressWidth = translateX.value + thumbSize / 2; return { @@ -146,7 +172,7 @@ export default function MoodIntensitySlider({ end={{ x: 1, y: 0 }} /> - + {/* 进度条 - 动态颜色 */} - + {/* 可拖拽的thumb */} @@ -166,17 +192,17 @@ export default function MoodIntensitySlider({ start={{ x: 0, y: 0 }} end={{ x: 0, y: 1 }} /> */} - + - + {/* 标签 */} 轻微 强烈 - + {/* 刻度 */} {Array.from({ length: max - min + 1 }, (_, i) => i + min).map((num) => ( @@ -192,39 +218,38 @@ export default function MoodIntensitySlider({ const styles = StyleSheet.create({ container: { alignItems: 'center', - paddingVertical: 16, + paddingTop: 8, + paddingBottom: 4, }, sliderContainer: { - height: 50, + height: 10, justifyContent: 'center', position: 'relative', - paddingHorizontal: 20, }, track: { position: 'absolute', - left: 20, - right: 20, - borderRadius: 8, + left: 0, + right: 0, + borderRadius: 6, overflow: 'hidden', }, trackGradient: { flex: 1, - borderRadius: 8, + borderRadius: 6, }, progress: { position: 'absolute', - left: 20, - borderRadius: 8, + left: 0, + borderRadius: 6, overflow: 'hidden', }, progressGradient: { flex: 1, - borderRadius: 8, + borderRadius: 6, }, thumb: { position: 'absolute', - left: 22, - elevation: 6, + left: 0, overflow: 'hidden', }, thumbGradient: { @@ -234,14 +259,11 @@ const styles = StyleSheet.create({ }, thumbInner: { width: 16, - height: 32, + height: 28, borderRadius: 8, backgroundColor: '#ffffff', - shadowColor: '#ffffff', - shadowOffset: { width: 0, height: 1 }, - shadowOpacity: 0.3, - shadowRadius: 2, - elevation: 2, + borderWidth: 2, + borderColor: '#7a5af8', }, valueContainer: { marginTop: 20, @@ -266,33 +288,31 @@ const styles = StyleSheet.create({ labelsContainer: { flexDirection: 'row', justifyContent: 'space-between', - marginTop: 8, - paddingHorizontal: 20, + marginTop: 6, }, labelText: { - fontSize: 14, + fontSize: 12, color: '#5d6676', - fontWeight: '600', + fontWeight: '500', }, scaleContainer: { flexDirection: 'row', justifyContent: 'space-between', - marginTop: 16, - paddingHorizontal: 20, + marginTop: 12, }, scaleItem: { alignItems: 'center', flex: 1, }, scaleMark: { - width: 2, - height: 10, + width: 1.5, + height: 8, backgroundColor: '#e5e7eb', - borderRadius: 1, + borderRadius: 0.75, }, scaleMarkActive: { backgroundColor: '#7a5af8', - width: 3, - height: 12, + width: 2, + height: 10, }, });